在服务中维护数据时使用ChangeDetectionStrategy.OnPush

时间:2018-02-21 21:25:27

标签: angular

我目前正在开发一个角度应用程序(基于文本的游戏),我想使用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作业触发的。

0 个答案:

没有答案