Angular2.x 指令

1. 指令:

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

結構型指令 — 通過添加和移除 DOM 元素改變 DOM 布局的指令。

屬性型指令 — 改變元素、組件或其它指令的外觀和行為的指令。

組件是這三種指令中最常用的。
結構型指令修改視圖的結構。例如,NgForNgIfNgSwitch。要了解更多,參見結構型指令
屬性型指令改變一個元素的外觀或行為。例如,內(nèi)置的 NgStyle指令可以同時修改元素的多個樣式。

2. 宿主元素(host element)

了解指令前,我們需要先理解宿主元素。對于指令來說,這個概念是相當簡單的。應用指令的元素,就是宿主元素。如下文綁定自定義結構型指令的P標簽就是宿主元素。

3. 自定義結構型指令
  • 創(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中導入
declarations: [
    AppComponent,
    CompositionDirective
],
  1. 模板中使用
<p *appComposition="false">當appComposition為false時出現(xiàn)這段話</p>

or

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

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

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

c. 當appCompositionfalse,調(diào)用ViewContainerRef類實例的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中導入
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 是屬性裝飾器,用來動態(tài)設置宿主元素的屬性值。
    c. Angular 會為每個匹配的元素創(chuàng)建一個指令控制器類的實例,并把 Angular 的ElementRefRenderer注入進構造函數(shù)。ElementRef是一個服務,它賦予我們通過它的nativeElement屬性直接訪問 DOM 元素的能力。Renderer服務允許通過代碼設置元素的樣式。
最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

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

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