【问题标题】:Angular 6: Why aren't the results of Next visible immidiately? [closed]Angular 6:为什么 Next 的结果不能立即可见? [关闭]
【发布时间】:2019-08-17 10:16:02
【问题描述】:

这更像是一个理论问题,因为我手头没有代码,但我认为仍然可以回答。

我有一个服务 (MsgService) 负责向组件提供 msg-s。当我使用与此类似的方法从其中一个组件更新/设置服务的 msg-s 时:

myMethod(data) {
        this.myMethodSubject.next(data);
    }

新的 msg-s 不可见,但只有在我刷新页面后才可见。我想看到在所有组件(订阅它的)和视图上立即调用next 的结果,但我需要刷新页面一次以使结果可见。这可能是什么原因?或者更笼统地说——在什么情况下Next 和订阅的结果是可见的?

(顺便说一句:我正在调用从 NgOnInit 给我 msg-s 的 subscribe 方法,我应该把它放在其他地方吗?)

编辑:我从其中一个组件订阅的内容如下所示:

ngOnInit() { this.msgService.getMsgParams().subscribe(data => { this.params = data; }); 

this.msgService.getMsgs (this.params.category, this.params.price, this.params.title).subscribe(data => this.msgs = data); 
}

到目前为止,我还没有退订,这与问题有关吗?

【问题讨论】:

  • 您是如何处理订阅的?数据应立即可用。你也取消订阅吗?也许组件中的一些代码会提供一些见解
  • 最可能的原因是您没有将变量数据放入订阅函数
  • 没有代码就无法回答,还有什么困扰我的是刷新后你看到这意味着你正在保存和重新加载数据。
  • @Ric 我还没有退订,可以改变吗?我在上面发布了代码(至少我记得的)。谢谢你的建议!
  • @Eliseo,我不确定我是否理解相等的含义。我之后发布的编辑代码会这样做吗?无论如何谢谢你!

标签: angular rxjs observable subject


【解决方案1】:

使用 async 订阅的组件视图不会更新,原因如下。

  • 视图不使用async 管道来显示来自可观察对象的值。
  • 订阅者未使用markForCheck() 将视图标记为脏视图

由于以下原因,共享服务无法将数据传输到组件。

  • 服务正在使用Subject,并且在组件订阅之前发出的值丢失。请尝试改用BehaviorSubject()ReplaySubject()
  • 服务不是单例,并且发出值的服务是与订阅组件不同的实例。尝试使用 @Injector({provideIn:'root"}) 以确保它是单例。

这些是人们提出上述问题的主要原因。您的数据可能没有更新还有其他原因,但这些原因往往与 rxjs 无关。假设这是一个可观察到的问题,那么我会检查以上内容,看看它是否能解决您的问题。

【讨论】:

  • 非常感谢您的回答!我已经尝试过最多,但会再试一次,现在我发现我走在了正确的轨道上。关于 markForCheck - 我没有(故意)使用 onPush 策略,它是否仍然相关?再次感谢您。
  • @Mandy 您仍然必须在异步操作天气中使用 markForCheck,或者您是否正在使用 OnPush。组件无法知道它的状态是否发生了变化。
  • 谢谢!!我还没有尝试过,因为我完全误解了文档。再次非常感谢你,你很可能把我从另一天的无用尝试中拯救出来。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-04
  • 2019-03-31
  • 2021-11-28
  • 1970-01-01
  • 2017-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多