属性型指令

属性型指令用于改变一个DOM元素的外观或行为。

创建属性型指令

使用命令创建一个指令类文件

  1. ng g directive directives/highlight

创建的指令带有两个文件:

  • highlight.directive.ts ```typescript import { Directive } from ‘@angular/core’;

@Directive({ // 此处的方括号表示它是css属性型选择器 // angular会自动为选择器前面加上app前缀,确保它不会和标准html属性冲突,同时也减少与第三方指令名字冲突的危险 selector: ‘[appHighlight]’ }) export class HighlightDirective {

constructor() { }

}

  1. -
  2. hightligth.directive.spec.ts (测试文件,可删除)
  3. 在根模块自动声明该指令类(若需在其他模块使用,则在其他模块中声明该指令):
  4. ```typescript
  5. import { BrowserModule } from '@angular/platform-browser';
  6. import { AppComponent } from './app.component';
  7. // 自动引入该指令类
  8. import { HighlightDirective } from './directives/highlight.directive';
  9. @NgModule({
  10. declarations: [
  11. AppComponent,
  12. // 声明该指令类
  13. HighlightDirective
  14. ],
  15. imports: [
  16. BrowserModule
  17. ],
  18. providers: [],
  19. bootstrap: [AppComponent]
  20. })
  21. export class AppModule { }

修改指令类,实现带有该指令修饰的标签:鼠标移入时变黄色,鼠标移出时取消背景色

  1. import { Directive, ElementRef, HostListener } from '@angular/core';
  2. @Directive({
  3. selector: '[appHighlight]'
  4. })
  5. export class HighlightDirective {
  6. constructor(private el: ElementRef) { }
  7. // 使用HostListener装饰器订阅当前指令所在宿主dom的事件
  8. @HostListener('mouseenter') onMouseEnter() {
  9. this.highlight('yellow');
  10. }
  11. @HostListener('mouseleave') onMouseLeave() {
  12. this.highlight(null);
  13. }
  14. private highlight(color: string) {
  15. // 通过ElementRef的nativeElement可以获取到该指令的宿主dom元素
  16. this.el.nativeElement.style.backgroundColor = color;
  17. }
  18. }

在html中使用该属性型指令:

  1. <p appHighlight>
  2. hello world
  3. </p>

为属性型指令插入变量值

修改上面的HighlightDirective类的代码:

  1. import { Directive, ElementRef, HostListener, Input } from '@angular/core';
  2. @Directive({
  3. selector: '[appHighlight]'
  4. })
  5. export class HighlightDirective {
  6. // 使用Input接收一个与本指令的选择器同名的变量
  7. // 因为angular会为选择器加上app前缀,所以此处最好另起一个别名
  8. @Input('appHighlight') color:string;
  9. constructor(private el: ElementRef) { }
  10. @HostListener('mouseenter') onMouseEnter() {
  11. this.highlight(this.color || 'yellow');
  12. }
  13. @HostListener('mouseleave') onMouseLeave() {
  14. this.highlight(null);
  15. }
  16. private highlight(color: string) {
  17. this.el.nativeElement.style.backgroundColor = color;
  18. }
  19. }

测试html:

  1. <!-- 在该组件的ts中定义color变量,将color变量的值赋值为appHiglight指令 -->
  2. <p [appHighlight]='color'>
  3. hello world
  4. </p>