【问题标题】:@HostBinding initial @Input value ignored@HostBinding 初始 @Input 值被忽略
【发布时间】: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 上时是否有奇怪的交互?

【问题讨论】:

  • 我猜alloyToggledtoggled 从一开始就在战斗。由于 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


【解决方案1】:

有几个问题:

  • @Input 定义

  • 变量语法混淆

directive.ts

@Directive({
  selector: '[alloyToggled]'
})
export class HighlightDirective {
    @Input('alloyToggled') alloyToggled: boolean;
    @HostBinding('class.alloy-toggled')
    get isToggled() { return this.alloyToggled; }
    set isToggled(value: boolean) {
      this.alloyToggled = value;
      this.alloyToggledChange.emit(this.alloyToggled);
    }
    @Output() alloyToggledChange: EventEmitter<boolean> = new EventEmitter();

    toggle() {
      this.alloyToggled = !this.alloyToggled;
    }

    @HostListener('click')
    onclick() {
        this.alloyToggled = !this.alloyToggled;
        this.alloyToggledChange.emit(this.alloyToggled);
    }
}

html

<button [alloyToggled]="booleanValue">Toggle Alloy</button>

component.ts

export class AppComponent {
  booleanValue = true;
}

HighlightDirective 已编辑以反映您预期的代码行为。 https://stackblitz.com/edit/angular-lrmveu

从 Angular 高亮示例创建:https://stackblitz.com/angular/naavjopgege?file=src%2Fapp%2Fapp.component.html

【讨论】:

  • 有趣的是,将我的代码插入你的 stackblitz 也可以。它必须涉及与宿主组件的交互然后...
  • 原来另一个开发人员添加了一些与在按钮中设置alloy-toggled 的菜单相关的逻辑。由于我在库中编写了大部分代码,因此我什至没有想到要在内部检查按钮..._sigh_感谢您的帮助,将其标记为答案,因为它最终将我指向第三个罪魁祸首。跨度>
猜你喜欢
  • 2013-04-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多