Angular 可观察角度2未触发重新招标

Angular 可观察角度2未触发重新招标,angular,rxjs,observable,rxjs5,behaviorsubject,Angular,Rxjs,Observable,Rxjs5,Behaviorsubject,TLDR:Observable对象在用户执行操作之前不会触发组件重新排序(例如,单击按钮) 我正在更新一个由包含在注入到组件中的服务中的行为主体支持的可观察对象 在我的组件中,我使用一个简单的*ngIf=“myObservable$| async”来显示div 我成功地复制了两种情况,一种正常,另一种不正常,但我不明白有什么区别: //CASE 1 this._mySubject$.next(true); //THIS DOES TRIGGER RERENDERING //CASE 2 this

TLDR: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
});

如果需要执行副作用,请尝试在do操作符中执行

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

在ngOnInit方法中订阅行为主题并设置要在ngIf中使用的属性可能是一个更好的主意。由于实际对象不是新对象,只是行为主体的新发射,因此可能不会触发Angular的变化检测。对于不可变的对象,它似乎发挥得最好。

整个流是如何触发的?你用的是什么版本的angular2您可能可以通过将
.next(true)
包装在
ngZone.run(…)
中来解决您的问题-但是,对于简单的rest调用,这应该不是必需的,因此我当前的猜测是,您的rest调用不知何故被包装在其他异步/外部触发器中。我正在使用Angular 2.1.0。我已经订阅了observable的组件调用服务函数,该函数进行简单的http调用(不包含任何内容)。使用
subcribe()
块调用
.next()
有什么特殊原因吗?订阅块不应用于产生副作用。只有可观察对象的最终消费者应该订阅。你是对的。我需要在这里订阅以触发http调用,否则。在我的原始代码中,我在另一个
映射上执行
.next()
,然后我使用
.toPromise()
将可观察的内容转换为承诺。但不幸的是,这不是问题所在。同样对那些感兴趣的人来说,我正在使用这种状态管理体系结构:我也尝试过这种方式,但它仍然不会触发重新排序。@Yanis26在模板处您是否正在执行
*ngIf=“_mySubject$| async”
?我正在使用我的模板中我的行为主体的可观察性(
.mySubject$.asObservable()
)因此,组件不能改变数据。奇怪的是,我在使用相同的设置对其他3个行为subject/Observable执行此操作:http请求->将接收到的数据推送到我的subject->组件自身更新。只有这一个不起作用,这是相当令人沮丧的,因为所有其他事情都是完全相同的方式。