在angular2模板中访问私有属性的有效方法?

在angular2模板中访问私有属性的有效方法?,angular,typescript,Angular,Typescript,我有一个类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

我有一个类
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>

{{user.username}
很明显,这并不能很好地执行,因为angular不可能知道此列表何时更改,并且必须不断调用users.listUsers()以保持视图的更新。我是否可以限制这种行为并通知Angular列表已随某个事件而更改?我不想将列表公开,也不想直接访问模板中的私有属性

参考资料:

使用解决方案更新:

Amit关于使用OnPush更改检测的建议得到了解决。我在users服务中构建了一个回调,以通知使用它的任何组件私有用户列表的更改。然后,应用程序组件可以调用markForChange()来更新视图。这使我能够刷新视图,而不会破坏依赖项注入模式或试图实施的封装


我仍然对这种方法感到不满意,因为变更检测方案影响整个组件,而不是元素。在我看来,Angular无法有效地将函数结果绑定到元素,而不创建性能陷穴或破坏设计模式,或重新配置整个组件以观察该行为,这似乎很奇怪。

您可以使用OnPush更改检测策略,并在知道列表已更改时标记组件以检测更改。

您可以使用OnPush更改检测策略,并在知道列表已更改时标记组件以检测更改。

这不应该。我请求你不要这样做。它会坏的

请从您的服务中调用您的私有数据,并为模板设置公共变量,这不应该发生。我请求你不要这样做。它会坏的

请从您的服务调用您的私有数据,并为模板创建一个公共变量

我可以将userList视为一个服务(并将其称为usersService),并在应用程序组件中保留usersService.listUsers()的最新输出?这样,模板就可以绑定到数据的最新副本。这是我几乎要做的,但我需要一些应用组件控制器可以订阅的onChange事件,以防止数据过时。我不确定这是否是标准方法,或者大多数人是否会以某种方式在模板中绑定访问器getList()。@Austinmcool订阅后更改数据是可能的。在我将userList视为一项服务(并称之为usersService)并在应用程序组件中保留usersService.listUsers()的最新输出之前,您是否可以编辑您的问题并显示您尝试过的内容?这样,模板就可以绑定到数据的最新副本。这是我几乎要做的,但我需要一些应用组件控制器可以订阅的onChange事件,以防止数据过时。我不确定这是否是标准方法,或者大多数人是否会以某种方式在模板中绑定访问器getList()。@Austinmcool订阅后更改数据是可能的。在我需要研究如何使用OnPush更改检测之前,您可以编辑您的问题并展示您的尝试吗?然后我将再次发表评论…您基本上将组件设置为该更改策略,注入
ChanageDetectorRef
,并调用
markForCheck()
每当您认为需要重新评估视图时,都可以使用它。这非常有效。我在usersService中构建了一个回调,它将通知应用程序组件更改。然后,应用程序组件将调用markForCheck(),从而大大减少了对getter函数进行不必要轮询的频率。我仍然不相信有更好的方法可以将函数的返回值绑定到模板-请参阅我的问题更新。我感觉到了。我想如果某些函数可以被标记为纯函数,它们只能在输入更改后调用它们(它们已经知道如何正确地检测),我需要研究如何使用OnPush更改检测,然后我将再次进行评论…您基本上将组件设置为该更改策略,注入
ChanageDetectorRef
,并在您认为需要重新评估视图时调用它的
markForCheck()
。这非常有效。我在usersService中构建了一个回调,它将通知应用程序组件更改。然后,应用程序组件将调用markForCheck(),从而大大减少了对getter函数进行不必要轮询的频率。我仍然不相信有更好的方法可以将函数的返回值绑定到模板-请参阅我的问题更新。我感觉到了。我想如果一些函数可以被标记为纯函数,那么它们只能在输入发生变化时调用它们(它们已经知道如何正确地检测),或者为相关变量创建getter/setter?这就是我所做的。我更希望私有列表中只有getter才能访问。但这限制了我在模板中绑定的内容。我必须绑定getter函数,这意味着angular必须不断调用该函数以查看数据是否已更改。我现在正在研究OnPush变更检测,也许为相关变量创建getter/setter?这就是我所做的。我更希望私有列表中只有getter才能访问。但这限制了我在模板中绑定的内容。我必须绑定getter函数,这意味着angular必须不断调用该函数以查看数据是否已更改。我现在正在研究OnPush更改检测