中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Angular中如何自定義創建指令

發布時間:2021-04-29 11:27:29 來源:億速云 閱讀:194 作者:小新 欄目:web開發

小編給大家分享一下Angular中如何自定義創建指令,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

指令介紹

在 Angular 中有三種類型的指令:

  • 組件,有模板的指令,組件是繼承于指令的,只是擴展類與 UI 相關的屬性。

  • 屬性型指令,改變 DOM 元素、組件或其他指令的行為和外觀的指令。如,NgStyle、NgClass。

  • 結構型指令,通過添加或移除 DOM 元素改變 DOM 布局的指令。如,NgIf、NgFor。

然而,在實際的開發中,根據業務的需要,我們經常會拓展 Angular 組件的指令來方便業務的開發。下面讓我們來看看如何創建自己的指令。

創建屬性型指令

在 Angular 中,屬性型指令的創建至少需要一個帶有 @Directive 裝飾器的控制器類。這個裝飾器指定了一個選擇器名稱,用于標識與指令相關聯的屬性名稱。控制器類實現了指令的功能行為。

接下來,我們創建一個簡單的指令,實現鼠標在元素上懸停時,改變起背景顏色;鼠標移開時,背景顏色消失;鼠標點擊時,字體變大;鼠標松開時,字體恢復原樣的功能。

指令實現

創建 background-exed.directive.ts 文件,實現如下代碼:

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

@Directive({
  selector: '[appBackgroundExe]'
})
export class BackgroundExeDirective {

  @Input('appBackgroundExe')
  highLightColor: string;

  constructor(private elementRef: ElementRef, private renderer: Renderer2) {
    // 這種寫法比較丑陋
    // this.elementRef.nativeElement.style.background = 'yellow';
    // 推薦這種寫法, Renderer
    this.renderer.setStyle(this.elementRef.nativeElement, 'background', 'yellow');
  }

  @HostBinding('class.pressed')
  isPressed: boolean;

  @HostListener('mouseenter')
  onMouseEnter(): void {
   this.highLight(this.highLightColor);
  }

  @HostListener('mouseleave')
  onMouseLeave(): void {
    this.highLight(null);
  }

  @HostListener('mousedown')
  onMouseDown(): void {
    this.isPressed = true;
  }

  @HostListener('mouseup')
  onMouseUp(): void {
    this.isPressed = false;
  }

  private highLight(color: string): void {
    // this.elementRef.nativeElement.style.background = color;
    this.renderer.setStyle(this.elementRef.nativeElement, 'background', color);
  }

}

其中,selector: '[appBackgroundExe]' 是指令關聯的屬性名稱,以便 Angular 在編譯時,能從模板中找到與此指令關聯的 HTML 代碼。

構造函數中,注入了 ElementRefRenderer2 模塊的實例。通過 ElementRef 我們可以引用指令標識的 DOM 元素,并對其進行相關的操作;并且可以利用 Renderer2 提供的 API 對元素進行相關的渲染操作。

@HostListener@HostBinding 是屬性裝飾器。@HostListener 是用來為宿主元素添加事件監聽;而指令標記的元素,就是宿主元素。@HostBinding 是用來動態設置宿主元素的屬性值。

設置字體樣式

  • appliation.component.less

.pressed {
  font-size: 30px;
}

在模板中使用指令

  • application.component.html

<div class="panel panel-primary">
  <div [appBackgroundExe]="'red'">鼠標移進,元素變成紅色。鼠標移出,元素紅色消失</div>
</div>

創建結構型指令

結構型指令的創建與屬性型指令創建大同小異。

指令實現

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

@Directive({
    selector: '[appIf]'
})
export class IfDirective {

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

    @Input('ifCreat') 
    set condition(condition: boolean) {
       if (condition) {
         this.viewContainerRef.createEmbeddedView(this.templateRef);
       } else {
         this.viewContainerRef.clear();
       }
    }
}

其中,TemplateRef 表示內嵌的 template 模板元素,通過它可以創建內嵌視圖。ViewContainerRef 表示一個視圖容器,可以添加一個或多個視圖,通過它可以創建和管理基于 TemplateRef 實例的內嵌視圖或組件視圖。

在模板中使用指令

  • application.component.html

<div class="panel panel-primary">
  <div *ifCreate="'true'">hello</div>
</div>

以上是“Angular中如何自定義創建指令”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

绥中县| 商水县| 洛南县| 曲麻莱县| 富平县| 稻城县| 胶州市| 长丰县| 南木林县| 新田县| 浦东新区| 稷山县| 新泰市| 比如县| 承德县| 石台县| 佛山市| 余庆县| 海南省| 新疆| 清丰县| 台湾省| 九台市| 万载县| 余干县| 双辽市| 蛟河市| 马边| 酉阳| 封开县| 调兵山市| 化德县| 改则县| 蕉岭县| 普陀区| 舟曲县| 青铜峡市| 泸州市| 广灵县| 蓝田县| 凤城市|