【问题标题】:Angular 2 : @HostBinding with an Input object propertyAngular 2:带有 Input 对象属性的 @HostBinding
【发布时间】:2018-01-11 04:46:31
【问题描述】:

是否可以像这个例子一样绑定@HostBinding 值?

@Input() user: User;
@HostBinding("class.temp") user.role == "Admin"

我知道我能做到:

private _user: User;
@Input() set user(user: User) {
    this._user = user;
    this.temp = (this._user.role == "Admin");
}
@HostBinding("class.temp") temp: boolean;

但是在这种情况下,如果我的用户更改了他的角色,则该组件中的值将永远不会更新。这个怎么做 ?

【问题讨论】:

    标签: angular angular2-hostbinding


    【解决方案1】:

    这就是我对对象属性进行主机绑定的方式:

    @Input()
    public user: User;
    
    @HostBinding('class.example')
    public get isExample(): boolean {
         return this.user && this.user.role === 'admin';
    }
    

    如果您发现自己卡住了,只需要让该功能正常工作。您可以使用DoCheck 接口在每次更改检测时检查角色更改。这告诉 Angular 调用ngDoCheck 来检测每个变化。

    @Input()
    public user: User;
    
    @HostBinding('class.example')
    public isExample: boolean;
    
    public ngDoCheck(): void {
         this.isExample = this.user && this.user.role === 'admin';
    }
    

    以上内容增加了应用程序的开销,并不是最佳实践。

    您应该像这样将输入分成Userrole

    @Input()
    public user: User;
    
    @Input()
    public role: string;
    
    @HostBinding('class.example')
    public get isExample(): boolean {
        return this.role === 'admin';
    }
    

    这是最简单的解决方案。因为它使用 Angular 自己的变更检测。

    另一个解决方案是使user 对象不可变。这样,每次更改属性时都会创建一个新的用户对象。这也将触发 Angular 中的更改检测,并且是在绑定中处理对象的首选方式。

    话虽如此,不可变也有局限性,使用起来会很痛苦。

    还有其他解决方案,例如自定义 observables 和使用 ChangeDetectRef 告诉组件发生了变化。这些解决方案涉及更多,我认为组件应该保持简单。

    我尝试遵循 primitive 绑定规则。组件的所有输入都是数字或字符串类型。避免使用数组和对象。

    在您的示例中,您的组件是否真的需要完全访问用户对象或只是其中一些属性?如果您为所需的每个属性添加输入,那么您已经将组件与用户对象分离,这也使得测试变得更容易。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-29
      • 1970-01-01
      • 2016-04-25
      • 2016-03-27
      • 1970-01-01
      • 1970-01-01
      • 2017-12-08
      相关资源
      最近更新 更多