繁体   English   中英

异步 pipe 不更新视图

[英]Async pipe not updating the view

复现

https://stackblitz.com/edit/angular-rlqkyb

应用服务

创建一个具有一些默认值的 BehaviorSubject 的简单服务,一个 function 将此主题作为可观察对象返回,最后一个 function 以发出关于该主题的新值。

应用组件

该组件仅获取对服务返回的可观察对象的引用,并通过异步 pipe 订阅它。请注意,可观察对象通过管道传输以显示发出的值。

该组件还显示第二个组件。

app2.component

该组件有一个输入,该输入订阅由发出新值的服务返回的可观察对象,仅此而已。

问题

问题是,即使我在控制台中看到了新值,app.component 的视图也没有更新。

起初,我认为这是因为服务返回的可观察对象不在区域中,所以我尝试将这个 function 的一部分包装到zone.run中(可观察对象的全部内容以及下一个/完整调用)但它仍然没有用。

一件可行的事情是 app2.component 中的注释行,它使用 setTimeout 订阅可观察对象。

另一件可行的事情是将更改检测策略设置为默认而不是 OnPush,但是,我不希望这样做。

在我看来,app.component 获取可观察对象,通过异步 pipe 订阅它(因此它应该在收到新值后立即刷新值,这是可观察对象的目标,向 Angular 表明某些内容已更改) . 同时,app2.component 被加载并通过其输入更新可观察对象,因此 app.component 的异步 pipe 应该获取新值并更新其视图,就像它在没有 OnPush 策略的情况下所做的那样。

我非常有信心这不是 angular 问题,而是我的误解,但如果有人能解释我错在哪里,我将不胜感激:-)

请注意,我还检查了 StackOverflow 上的其他线程,但他们都在谈论zone.run或使用detectChanges (我不知道在哪里使用它)

从 observable 发出一个新值标志着 OnPush 组件在下一个变化检测周期中被检查。 但我认为在您的情况下,根本没有发生任何事情会触发应用程序中的 CD 循环。 这解释了为什么带有 setTimeout 的行修复它: setTimeout 触发 CD 循环,并且因为组件被标记为要检查,所以它被更新。

添加.slice() ,angular 会刷新。

let objects = this.state.objects.slice();
this.state = {...this.state, objects};

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM