【发布时间】:2020-02-07 20:34:08
【问题描述】:
我有一个指令可以帮助为各种元素添加切换效果。
export class AlloyToggleDirective {
private toggled = false;
@Input('alloyToggled')
@HostBinding('class.alloy-toggled')
get isToggled() { return this.toggled; }
set isToggled(value: boolean) {
this.toggled = value;
this.alloyToggledChange.emit(this.toggled);
}
@Output() alloyToggledChange: EventEmitter<boolean> = new EventEmitter();
toggle() {
this.toggled = !this.toggled;
}
@HostListener('click')
onclick() {
this.toggled = !this.toggled;
this.alloyToggledChange.emit(this.toggled);
}
}
切换时效果很好,但初始绑定值被忽略:
<button [alloyToggled]="booleanValue">
HTML 将反映该初始值,但该类仅在以编程方式或通过鼠标切换后应用。当@HostBinding 在@Input 上时是否有奇怪的交互?
【问题讨论】:
-
我猜
alloyToggled和toggled从一开始就在战斗。由于 get 从一开始就应用 false,您将始终收到 false。您是否有理由不使用alloyToggled,而是使用private toggled? -
看看这个 stackblitz,我想它会帮助你清理指令:stackblitz.com/angular/…(也可以帮助@Input 语法)
-
如果是这样,
onClick和对booleanValue的更改将不起作用。然而,他们确实如此。 只有booleanValue的初始值被忽略。 -
您实际上是在手动更改组件中的“booleanValue”吗?乍一看,“alloyToggled”和“booleanValue”似乎都被忽略了,甚至不是这里等式的一部分。
-
为了测试我以编程方式交换
booleanValue。它以true开头,但不适用于alloy-toggled。单击一次什么也不做,它会切换到false,因此不应该有这个类。第二次单击应用该类,因为内部布尔值现在为真。所以初始值 确实 在指令中设置,但是,HostBinding只是忽略它。但是,听听所有以下更改是内容。host元数据的行为相同。
标签: angular angular2-hostbinding angular2-inputs