2017-01-24 28 views
-1

TLDR:直到用户执行操作(例如,单击按钮)时,可观察对象才会触发组件重新渲染。Angular2 Observable not triggering rerendering

我正在更新由组件内注入的服务中包含的BehaviorSubject支持的observable。

在我的组件中,我使用简单的*ngIf="myObservable$ | async"来显示div。

我设法复制2分的情况下,一个工作,一个是不,但我不明白有什么区别:

//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 
}); 
+2

整个流如何触发?你使用的是什么版本的angular2? - 你可以通过在'ngZone.run(...)'中包装'.next(true)'来解决你的问题 - 但是这对于简单的休息调用来说不是必须的,所以我目前的猜测是你的rest-call以某种方式包装在其他异步/外部触发器中 – olsn

+0

我正在使用Angular 2.1.0。 我已经订阅了observable的组件调用了服务函数,它使得简单的http调用(不包含任何东西)。 – Yanis26

+0

使用'subcribe()'块调用'.next()'的任何特定原因?订阅模块不应该用于产生副作用。只有观察者的最终消费者才能认购。 – AngularChef

回答

0

如果您需要做的副作用,何乐而不为呢在操作

this.http.get(url) 
.map(res => res.json()) 
.do(() => this._mySubject$.next(true)) 
.subscribe(); 
+0

我也试过这种方式,它仍然不会触发重新渲染。 – Yanis26

+0

@ Yanis26在模板中,你正在执行'* ngIf =“_ mySubject $ | async”'? –

+0

我在我的模板('_.mySubject $ .asObservable()')中使用了我的BehaviorSubject的observable,所以组件不能改变数据。 奇怪的是,我正在用另外3个BehaviorSubject/Observable执行相同的设置:http请求 - >将接收到的数据推送到我的主题 - >组件自我更新。 只有这一个不起作用,这是非常令人沮丧的,因为一切都是完全一样的。 – Yanis26

0

这可能是一个更好的主意,订阅在ngOnInit方法的行为主体和设置在ngIf使用属性。由于实际对象不是一个新对象,而是来自行为主体的新发射,它可能不会触发Angular的变化检测。它似乎最适合不可变对象。