TLDR:在用户进行操作之前,可观察对象不会触发组件重新渲染(例如,单击按钮)。
我正在更新一个由包含在我的组件内注入的服务中的BehaviorSubject支持的observable。
在我的组件中,我使用简单的*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
});
答案 0 :(得分:0)
如果您需要进行副作用,请尝试在执行运算符
中执行此操作this.http.get(url)
.map( res => res.json() )
.do( () => this._mySubject$.next(true))
.subscribe();
答案 1 :(得分:0)
最好在ngOnInit方法中订阅行为主题,并设置要在ngIf中使用的属性。由于实际对象不是新对象,只是来自行为主体的新发射,因此可能不会触发Angular的变化检测。它似乎与不可变对象一起发挥最佳效果。