Ionic3 自定義指令

在 Angular 中有三種類型的指令

  • 組件 — 擁有模板的指令
  • 結(jié)構(gòu)型指令 — 通過添加和移除 DOM 元素改變 DOM 布局的指令
  • 屬性型指令 — 改變元素、組件或其它指令的外觀和行為的指令窗声。

組件的概念比較大肛走,本文講解的是屬性指令和結(jié)構(gòu)指令的創(chuàng)建和使用损合,Angular官方文檔

創(chuàng)建屬性指令

創(chuàng)建一個指令可以直接使用ionic cli 工具

ionic g directive sxylight 
//sxylight 是該屬性指令的名稱

如果是首次執(zhí)行該命令亚再,會在 src 目錄下生成一個 directives 目錄岭粤,如同時在 directives 目錄下生成 directives.module.ts 文件,該文件使用 @NgModule 注解派昧,是一個模塊黔姜,用于統(tǒng)一自定義的指令。同時生成的還有sxylight 指令蒂萎,并且 ionic cli 會自動將指令的信息添加到 directives.module.ts 模塊中秆吵。

大概是這樣子的,只看標記的地方五慈,多余的東西和本文無關


image.png

sxylight.ts 就是指令的具體實現(xiàn)纳寂,代碼如下

import {Directive, ElementRef, HostListener, Input} from '@angular/core';

@Directive({
  selector: '[sxylight]'
})
export class SxylightDirective {

  constructor(private el: ElementRef) {
    el.nativeElement.style.backgroundColor = 'yellow';
  }

  @Input('sxylight') highlightColor: string;

  @Input() defaultColor: string;

  @HostListener('mouseenter') onMouseEnter() {
    this.highlight(this.highlightColor || this.defaultColor || 'red');
  }

  @HostListener('mouseleave') onMouseLeave() {
    this.highlight(null);
  }

  private highlight(color: string) {
    this.el.nativeElement.style.backgroundColor = color;
  }

}
該指令的主要功能是:當鼠標懸浮到使用該指令的元素上時主穗,元素的背景色發(fā)生變化。當鼠標離開時烈疚,清除背景色黔牵。
背景色的顏色可由父組件傳入。

selector: '[sxylight]' 是該指令在外部使用時的名稱
@Input 表示一個輸入屬性爷肝,表示可以從父組件傳值進來
@HostListener 可用于監(jiān)聽事件
ElementRef 可以 替代dom API 獲取元素 

使用屬性指令

使用自定義指令猾浦,有幾個地方需要注意:首先需要子在 directives.module.ts 文件中 導入和導出, 然后需要在你使用的模塊中導入灯抛。如果時使用 Ionic CLI工具創(chuàng)建的指令金赦,directives.module.ts 已經(jīng)自動配置好了,可以不用理會对嚼,需要的就是在別的模塊中 引入 DirectivesModule(directives.module.ts )模塊夹抗。比如,我需要在自己的 table模塊中引用這個指令纵竖,那么只需要子啊 table.module.ts中引入這個模塊即可漠烧,不需要在 app.module.ts中引入

導入工作做好之后,就可以直接在模板中使用該指令了

  <p>自定義屬性指令</p>
  <h1 [sxylight]="'cyan'" defaultColor="violet">測試自定義屬性指令</h1><br>

效果如下
初始化的時候



鼠標懸浮之后



鼠標離開之后

創(chuàng)建結(jié)構(gòu)指令

ionic g directive sxyunless

sxyunless.ts 代碼如下

import { Directive, Input, TemplateRef, ViewContainerRef } from '@angular/core';

@Directive({
  selector: '[sxyunless]'
})
export class SxyunlessDirective {

  private hasView = false;

  constructor(private templateRef: TemplateRef<any>,
              private viewContainer: ViewContainerRef) {
  }

  @Input()
  set sxyunless(condition: boolean) {
    if (!condition && !this.hasView) {
      this.viewContainer.createEmbeddedView(this.templateRef);
      this.hasView = true;
    } else if (condition && this.hasView) {
      this.viewContainer.clear();
      this.hasView = false;
    }
  }

}
這里定義了與 *ngIf 功能相反的指令靡砌,即:當條件不成立的時候才會生成對應的 DOM

使用結(jié)構(gòu)指令

因為在上面我們引進導入了 DirectivesModule 已脓,而 DirectivesModule 又包含了現(xiàn)在新創(chuàng)建的這個結(jié)構(gòu)指令,因此這里不需要在 table.module.ts 中導入模塊了通殃。

tables.html 關鍵代碼

  <p>自定義結(jié)構(gòu)指令</p>
  <h1 *sxyunless="false"> 測試自定義結(jié)構(gòu)指令  </h1><br>

測試結(jié)果如下

如果將 *sxyunless="false" 改成 *sxyunless="true"度液,即

  <p>自定義結(jié)構(gòu)指令</p>
  <h1 *sxyunless="true"> 測試自定義結(jié)構(gòu)指令  </h1><br>

則測試效果如下,該dom沒有加載

注意画舌,結(jié)構(gòu)指令在使用的時候必須加 * 堕担,如果不加 * ,會出問題
例如將代碼成如下

  <p>自定義結(jié)構(gòu)指令</p>
  <h1 sxyunless="false"> 測試自定義結(jié)構(gòu)指令  </h1><br>

會導致以下錯誤


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末曲聂,一起剝皮案震驚了整個濱河市霹购,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌句葵,老刑警劉巖厕鹃,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異乍丈,居然都是意外死亡剂碴,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門轻专,熙熙樓的掌柜王于貴愁眉苦臉地迎上來忆矛,“玉大人,你說我怎么就攤上這事〈哐担” “怎么了洽议?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長漫拭。 經(jīng)常有香客問我亚兄,道長,這世上最難降的妖魔是什么采驻? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任审胚,我火速辦了婚禮,結(jié)果婚禮上礼旅,老公的妹妹穿的比我還像新娘膳叨。我一直安慰自己,他們只是感情好痘系,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布菲嘴。 她就那樣靜靜地躺著,像睡著了一般汰翠。 火紅的嫁衣襯著肌膚如雪龄坪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天复唤,我揣著相機與錄音悉默,去河邊找鬼。 笑死苟穆,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的唱星。 我是一名探鬼主播雳旅,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼间聊!你這毒婦竟也來了攒盈?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤哎榴,失蹤者是張志新(化名)和其女友劉穎型豁,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體尚蝌,經(jīng)...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡迎变,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了飘言。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片衣形。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖姿鸿,靈堂內(nèi)的尸體忽然破棺而出谆吴,到底是詐尸還是另有隱情倒源,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布句狼,位于F島的核電站笋熬,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏腻菇。R本人自食惡果不足惜胳螟,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望芜繁。 院中可真熱鬧旺隙,春花似錦、人聲如沸骏令。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽榔袋。三九已至周拐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凰兑,已是汗流浹背妥粟。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吏够,地道東北人勾给。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像锅知,于是被迫代替她去往敵國和親播急。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理售睹,服務發(fā)現(xiàn)桩警,斷路器,智...
    卡卡羅2017閱讀 134,702評論 18 139
  • Spring Boot 參考指南 介紹 轉(zhuǎn)載自:https://www.gitbook.com/book/qbgb...
    毛宇鵬閱讀 46,855評論 6 342
  • Angular CLI 是什么昌妹? Angular CLI 是一個命令行接口(Command Line Interf...
    semlinker閱讀 4,197評論 0 39
  • D9龍山寺飞崖、微風百貨烂叔、新竹 去了臺灣的龍山寺,就是拍電影《艋舺》的那個寺廟蚜厉,那天剛好是一個法會长已,幾百名信眾一起唱經(jīng)...
    Audrey米可閱讀 280評論 0 0
  • 這段時間,我讀了《雄獅去流浪》這本書,這本書講了有五只半大的雄獅被趕出獅群术瓮,它們?yōu)榱顺缘介L頸鹿康聂,就和長頸鹿...
    薛瑞豐閱讀 587評論 0 0