我如何在自定义属性指令中使用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');
}
我无法访问蓝色和红色所在的范围吗?如果我创建一个切换,我可以用一个按钮更新这些值,但似乎我不能在指令本身内完成。这是一个准确的观察,我应该这样做,还是有一个我在文档中没有看到的替代方案?
答案 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!!
希望这有帮助!!