【问题标题】:Angular2 Observable not triggering rerenderingAngular2 Observable不会触发重新渲染
【发布时间】: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


【解决方案1】:

如果您需要做副作用,请尝试在 do 运算符中进行

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

【讨论】:

  • 这个方法我也试过了,还是没有触发重新渲染。
  • @Yanis26 在模板上你在做什么*ngIf="_mySubject$ | async" ??
  • 我在我的模板 (_.mySubject$.asObservable()) 中使用了我的 BehaviorSubject 的 observable,所以组件不能改变数据。奇怪的是,我正在使用相同的设置与其他 3 个 BehaviorSubject/Observable 一起执行此操作:http 请求 -> 将接收到的数据推送到我的主题中 -> 组件自行更新。只有这个不起作用,这很令人沮丧,因为其他一切都是以完全相同的方式完成的。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    • 2011-07-27
    • 1970-01-01
    相关资源
    最近更新 更多