我目前正在开发一个角度应用程序(基于文本的游戏),我想使用ChangeDetectionStrategy.OnPush
来确保应用程序具有反应性/高效性。虽然我理解变更检测和不可变的想法,但我很难将它应用于我的架构。
基本上,应用程序通过Web套接字连接(通过signalR)连接到后端。因此,我创建了负责数据的不同服务。例如,我有一个HangarService
,其中包含一个名为_hangars
的私有成员,其中包含有关玩家的机库和返回此数组的访问者(hangars
)的信息。此外,我有加载组件HangarPageComponent
的路由配置。这个组件基本上是这样做的:
<hangar *ngFor="let hangar of hangarService.hangars" [data]="hangar"></hangar>
这就是页面当前如何显示所有玩家的机库。
另一个重要的事情是这些服务可以改变他们维护的数据。事实上,让我们说玩家在地图上移动,我必须重新计算他和所有机库之间的距离。为此,当播放器移动时,后端通过Web服务器发送一条消息,该消息将被服务截获,这将改变所有机库的distance
属性。
我有机会在慢速计算机上测试应用程序,看起来该页面有点滞后,因此,我想使用OnPush
策略。我在这个主题上阅读了很多,但我真的不明白如何在我的案例中应用它。实际上,我的第一个问题是HangarPageComponent
没有输入而且没有以声明方式引用,它只是通过路由器实例化,所以我无法真正传递输入,所以如果我进入{{1}模式,它不会检测更新。
我还尝试创建我在OnPush
@Input
上定义的Observable
变量,并在我的ngOnInit
中使用async
管道。如果我在阵列级别的每次更改*ngFor
上发出(添加或删除项目),它就会起作用。但是,如果其中一个数组项的属性发生更改,则只有在“OnPush”(我也不喜欢)上设置Observable
时才会反映该属性。
基本上,问题是“当没有用户交互的服务维护/更新数据时,如何使用HangarComponent
更改策略”(实际上,可以修改数据库数据,因为交付到达它,这是由通过Web套接字发送信号的cron作业触发的。