这就是我对对象属性进行主机绑定的方式:
@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';
}
以上增加了应用程序的开销,并不是最佳实践。
您应该像这样将输入User
分开role
:
@Input()
public user: User;
@Input()
public role: string;
@HostBinding('class.example')
public get isExample(): boolean {
return this.role === 'admin';
}
这是最简单的解决方案。因为它使用 Angular 自己的变更检测。
另一种解决方案是使user
对象不可变。这样,每次更改属性时都会创建一个新的用户对象。这也将触发 Angular 中的更改检测,并且是在绑定中处理对象的首选方式。
话虽如此,不可变是有局限性的,使用起来可能很痛苦。
还有其他解决方案,例如自定义可观察对象和ChangeDetectRef
用于告诉组件发生了变化。这些解决方案涉及更多,我认为组件应该保持简单。
我尝试遵循原始绑定规则。组件的所有输入都是数字或字符串类型。避免数组和对象。
在您的示例中,您的组件是否真的需要完全访问用户对象或只是它的一些属性?如果您为所需的每个属性添加输入,那么您已经将组件与用户对象分离,这也使得测试变得更容易。