Angular 2.4.0目标NgClass内部属性指令

时间:2017-03-06 15:14:14

标签: angular typescript scope angular-directive

我如何在自定义属性指令中使用NgClass来更改主要元素CSS类?

如果我有这样的话:

@Component({
  selector: 'my-app',
  template: `
    <div>
      <div class="box" myDir [ngClass]="{'blue': blue, 'red': red}">   </div>
    </div>
  `,
});

然后,在myDir指令中,类似这样:

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

@Directive({
  selector: '[myDir]'
})

export class MyDirDirective {
  blue: boolean;
  red: boolean;

  constructor() { 
  }

  ngOnInit() {
  } 

  @HostListener('mouseenter', ['$event'])
  onMouseEnter(event) {
    event.preventDefault();
    event.stopPropagation();

    this.blue = true;
    this.red = false;

    console.log('mouseenter');
  }

  @HostListener('mouseleave', ['$event'])
  onMouseLeave(event) {
    event.preventDefault();
    event.stopPropagation();

    this.blue = true;
    this.red = false;

    console.log('mouseleave');
  }

我无法访问蓝色和红色所在的范围吗?如果我创建一个切换,我可以用一个按钮更新这些值,但似乎我不能在指令本身内完成。这是一个准确的观察,我应该这样做,还是有一个我在文档中没有看到的替代方案?

1 个答案:

答案 0 :(得分:0)

您的案例中的属性blue\red位于父组件my-app的范围内。

您可以在指令中创建一个Output事件,可以在父组件中订阅以更改值,

类似于下面的内容,

@Directive({
  selector: '[myDir]'
})
export class MyDirDirective {
  blue: boolean;
  red: boolean;

  @Output() myEvent = new EventEmitter();

  @HostListener('mouseenter', ['$event'])
  onMouseEnter(event) {
    event.preventDefault();
    event.stopPropagation();
    this.myEvent.next('blue');
  }

  @HostListener('mouseleave', ['$event'])
  onMouseLeave(event) {
    event.preventDefault();
    event.stopPropagation();
    this.myEvent.next('red');
  }
}

并在父组件中订阅此事件,以将颜色更新为blue\red

@Component({
  selector: 'my-app',
  template: `<h1>Hello {{name}}</h1>
  <div class="box" myDir (myEvent)="myEvent($event)"
        [ngClass]="{'blue': color === 'blue', 'red': color === 'red'}"> Hello World!!</div>
  `,
  styles:[`
  .blue{
    border: 1px solid blue;
  }
  .red{
     border: 1px solid red;
  }`]
})
export class AppComponent { 
  name = 'Angular';
  color = 'blue';

  myEvent(val){
    this.color = val;
  }
}

选中此Plunker!!

希望这有帮助!!