【发布时间】:2017-06-09 17:43:36
【问题描述】:
TLDR:可观察对象不会触发组件重新渲染,直到用户执行操作(例如单击按钮)。
我正在更新一个由 BehaviorSubject 支持的 observable,该 BehaviorSubject 包含在注入到我的组件中的服务中。
在我的组件中,我使用简单的*ngIf="myObservable$ | async" 来显示一个 div。
我设法复制了两种情况,一种有效,一种无效,但我不明白有什么区别:
//CASE 1
this._mySubject$.next(true); //THIS DOES TRIGGER RERENDERING
//CASE 2
this.http.get(url)
.map( res => res.json() )
.subscribe( body => {
this._mySubject$.next(true); //THIS DOESN'T TRIGGER RERENDERING UNTIL AN ACTION IS MADE
});
【问题讨论】:
-
整个流是如何触发的?您使用的是哪个版本的 angular2? - 您可以通过将
.next(true)包装在ngZone.run(...)中来解决您的问题 - 但是对于简单的休息调用来说这不是必需的,所以我目前的猜测是您的休息通话以某种方式包装在其他一些异步/外部触发 -
我使用的是 Angular 2.1.0。我已经订阅了 observable 的组件调用了服务函数,这使得简单的 http 调用(不包含在任何东西中)。
-
使用
subcribe()块调用.next()的任何特殊原因?不应使用订阅块来产生副作用。只有 observable 的最终消费者应该订阅。 -
你是对的。我需要在这里订阅才能触发 http 调用。在我的原始代码中,我在另一个
map上执行.next(),然后使用.toPromise()将可观察对象转换为Promise。但不幸的是,这不是问题。同样对于那些感兴趣的人,我正在使用这种状态管理架构:coryrylan.com/blog/angular-observable-data-services
标签: angular rxjs observable rxjs5 behaviorsubject