Angular2.x 指令

1. 指令:

在 Angular 中有三種類型的指令:
組件 — 擁有模板的指令付呕。

結(jié)構(gòu)型指令 — 通過添加和移除 DOM 元素改變 DOM 布局的指令媒峡。

屬性型指令 — 改變?cè)厮杳薄⒔M件或其它指令的外觀和行為的指令舞蔽。

組件是這三種指令中最常用的缸棵。
結(jié)構(gòu)型指令修改視圖的結(jié)構(gòu)。例如柿冲,NgFor茬高、NgIfNgSwitch假抄。要了解更多雅采,參見結(jié)構(gòu)型指令
屬性型指令改變一個(gè)元素的外觀或行為慨亲。例如婚瓜,內(nèi)置的 NgStyle指令可以同時(shí)修改元素的多個(gè)樣式。

2. 宿主元素(host element)

了解指令前刑棵,我們需要先理解宿主元素巴刻。對(duì)于指令來說,這個(gè)概念是相當(dāng)簡單的蛉签。應(yīng)用指令的元素胡陪,就是宿主元素。如下文綁定自定義結(jié)構(gòu)型指令的P標(biāo)簽就是宿主元素碍舍。

3. 自定義結(jié)構(gòu)型指令
  • 創(chuàng)建指令 composition.directive.ts
import {Directive, Input, TemplateRef, ViewContainerRef} from '@angular/core';

@Directive({
  selector: '[appComposition]'
})
export class CompositionDirective {

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

  @Input()
  set appComposition (c: boolean) {
    if (!c) {
      this.viewContainer.createEmbeddedView(this.templateRef);
    } else {
      this.viewContainer.clear();
    }
  }
}
  • 使用指令
  1. 在組件所屬模塊declarations中導(dǎo)入
declarations: [
    AppComponent,
    CompositionDirective
],
  1. 模板中使用
<p *appComposition="false">當(dāng)appComposition為false時(shí)出現(xiàn)這段話</p>

or

<ng-template [appComposition]="false">
<p>當(dāng)appComposition為false時(shí)出現(xiàn)這段話</p>
</ng-template>
  • 注意:

a. 我們可以使用TemplateRef取得宿主元素的內(nèi)容柠座,并通過ViewContainerRef來訪問這個(gè)視圖容器。

b. 使用@Input()片橡,通過setter截聽輸入屬性值的變化妈经,設(shè)置內(nèi)嵌視圖。

c. 當(dāng)appCompositionfalse,調(diào)用ViewContainerRef類實(shí)例的createEmbeddedView方法創(chuàng)建內(nèi)嵌視圖

4. 自定義屬性指令
  • 創(chuàng)建指令height-light.directive.ts
import {Directive, ElementRef, HostListener, Input} from '@angular/core';

@Directive({
  selector: '[appHeightLight]'
})
export class HeightLightDirective {
  public default = 'yellow'
  @Input('appHeightLight') light: string
  constructor(
    private el: ElementRef,
    private ren: Renderer2
  ) { }
  @HostListener('mouseenter') onMouseEnter () {
    console.log(this.el)
    this.el.nativeElement.style.backgroundColor = this.light;
    this.ren.setStyle(this.el.nativeElement, 'fontSize', '20px');
  }
  @HostListener('mouseleave') onMouseLeave () {
    this.el.nativeElement.style.backgroundColor = this.default;
  }
}
  • 使用指令
  1. 在組件所屬模塊declarations中導(dǎo)入
declarations: [
    AppComponent,
   HeightLightDirective
],
  1. 模板中使用

<p [appHeightLight]="'blue'">Highlighted in blue</p>
or
<p appHeightLight="orange">Highlighted in orange</p>

  • 注意:
    a. HostListener 是屬性裝飾器吹泡,用來為宿主元素添加事件監(jiān)聽骤星。
    b. HostBinding 是屬性裝飾器,用來動(dòng)態(tài)設(shè)置宿主元素的屬性值爆哑。
    c. Angular 會(huì)為每個(gè)匹配的元素創(chuàng)建一個(gè)指令控制器類的實(shí)例洞难,并把 Angular 的ElementRefRenderer注入進(jìn)構(gòu)造函數(shù)。ElementRef是一個(gè)服務(wù)揭朝,它賦予我們通過它的nativeElement屬性直接訪問 DOM 元素的能力队贱。Renderer服務(wù)允許通過代碼設(shè)置元素的樣式。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末潭袱,一起剝皮案震驚了整個(gè)濱河市露筒,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌敌卓,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件伶氢,死亡現(xiàn)場離奇詭異趟径,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)癣防,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門蜗巧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蕾盯,你說我怎么就攤上這事幕屹。” “怎么了级遭?”我有些...
    開封第一講書人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵望拖,是天一觀的道長。 經(jīng)常有香客問我挫鸽,道長说敏,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任丢郊,我火速辦了婚禮盔沫,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘枫匾。我一直安慰自己架诞,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開白布干茉。 她就那樣靜靜地躺著谴忧,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上俏蛮,一...
    開封第一講書人閱讀 52,158評(píng)論 1 308
  • 那天撑毛,我揣著相機(jī)與錄音,去河邊找鬼纯命。 笑死免胃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的辣恋。 我是一名探鬼主播亮垫,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢(mèng)啊……” “哼伟骨!你這毒婦竟也來了饮潦?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤携狭,失蹤者是張志新(化名)和其女友劉穎继蜡,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逛腿,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡稀并,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了单默。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片碘举。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖搁廓,靈堂內(nèi)的尸體忽然破棺而出引颈,到底是詐尸還是另有隱情,我是刑警寧澤境蜕,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布蝙场,位于F島的核電站,受9級(jí)特大地震影響粱年,放射性物質(zhì)發(fā)生泄漏李丰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一逼泣、第九天 我趴在偏房一處隱蔽的房頂上張望趴泌。 院中可真熱鬧,春花似錦拉庶、人聲如沸嗜憔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽吉捶。三九已至夺鲜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間呐舔,已是汗流浹背币励。 一陣腳步聲響...
    開封第一講書人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留珊拼,地道東北人食呻。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像澎现,于是被迫代替她去往敵國和親仅胞。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • 一剑辫、起項(xiàng)目 根據(jù)官方教程干旧,執(zhí)行以下: 然后要把下面文件略微改一下(官方?jīng)]有寫),否則編譯出的js和ts混在一起妹蔽,很...
    Angeladaddy閱讀 1,293評(píng)論 0 4
  • 學(xué)習(xí)資料來自 Angular.cn 與 Angular.io椎眯。 模板語法 在線例子 在 Angular 中,組件扮...
    小鐳Ra閱讀 3,745評(píng)論 0 3
  • 最終總結(jié): 兩種用法胳岂。(* 與 template)控制宿主元素的模板编整。在哪里去顯示,viewcontain 怎么注...
    賀賀v5閱讀 910評(píng)論 0 1
  • 十幾年前我剛進(jìn)入基金業(yè)的時(shí)候旦万,曾經(jīng)問過公司的一個(gè)資深合伙人,怎樣才能成為一名優(yōu)秀的基金經(jīng)理镶蹋。他說成艘,其實(shí)很簡...
    新時(shí)代士的精神閱讀 441評(píng)論 2 8
  • cocoapods相信每一位iOS開發(fā)者都接觸并使用過。 在我們項(xiàng)目中贺归,使用的是cocoapods來管理公共庫如一...
    南京小伙閱讀 1,196評(píng)論 0 2