【发布时间】:2018-06-17 07:41:54
【问题描述】:
我有一个类UserList 有一个私有内部变量,该变量设计为仅对访问函数可用。如何在 ngFor 绑定中以高效的方式访问该内部列表?
class UserList {
private users:user[] = []
public addUser():void{..}
public removeUser():void{..}
public listUsers():user[]{
return this.users; //this is the only way to access the private users list
}
}
然后在某个组件中..
@component ({...})
class AppComponent {
users:UserList = new UserList();
}
在该组件的模板中,getter 函数被调用..
<span *ngFor="let user in users.listUsers()">
{{ user.username }}
</span>
很明显,这并不能很好地执行,因为 Angular 不可能知道此列表何时更改,并且必须不断调用 users.listUsers() 以保持视图更新。我可以以某种方式限制这种行为并通知 Angular 该列表已随某些事件发生更改吗?我不想公开列表,也不想直接在模板中访问私有属性。
参考资料: Angular2 - should private variables be accessible in the template?
更新解决方案:
Amit 关于使用 OnPush 更改检测的建议得到了解决。我在用户服务中构建了一个回调,以通知任何使用它的组件私有用户列表的更改。然后应用程序组件可以调用 markForChange() 来更新视图。这让我可以在不破坏依赖注入模式或我试图强制执行的封装的情况下刷新视图。
我仍然对这种方法感到不满意,因为更改检测方案会影响整个组件而不是元素。对我来说,Angular 无法有效地将函数的结果绑定到元素上似乎很奇怪,而不会造成性能漏洞或破坏设计模式,或者重新配置整个组件以观察该行为。
【问题讨论】:
-
也许为相关变量创建getter/setter?
-
这就是我所做的。我希望私人列表中只有吸气剂可以访问。但这限制了我可以在模板中绑定的内容。我必须绑定 getter 函数,这意味着 angular 必须不断调用该函数以查看数据是否已更改。我现在正在研究 OnPush 更改检测
标签: angular typescript