【问题标题】:Observable.subscribe() works only once (ngrx\angular2)Observable.subscribe() 只工作一次 (ngrx\angular2)
【发布时间】:2016-06-02 19:39:13
【问题描述】:

我正在订阅组件构造函数中的存储属性

constructor(private someService: SomeService){
        someService.someObservable.subscribe((data: Some)=> {
            this.some = data;
            console.log('changed');
        });
}

在服务中,构造函数如下所示:

constructor(private store: Store<any>){
        this.someObservable = <Observable<{}>>store.select('some');
}

我不断改变这个对象的状态,但日志只出现一次。 同样奇怪的是,我直接在我的模板中访问this.some 属性(没有async 管道),并且它更新完美! this.some 属性似乎正在更新,但订阅中的 next() 不起作用。

帮助任何人?谢谢!

【问题讨论】:

  • 你们的服务是什么样的?
  • 在服务器构造函数中我暴露了Observable,像这样:this.some = &lt;Observable&lt;{}&gt;&gt;store.select('some')
  • 我很困惑。 some 和 Observable 还是您的数据?您可以在示例中添加更完整的代码吗?最好是可以运行并重现问题的东西?
  • 我编辑了代码。希望它更清楚。
  • @GünterZöchbauer 不应该在每次商店发生变化时调用next() 吗?

标签: angular rxjs angular2-services ngrx


【解决方案1】:

在我非常相似的情况下,问题是订阅处理程序之一引发了错误。当遇到错误时,可观察流停止发出新值。

【讨论】:

  • 这是为我做的。值得注意的是,控制台没有任何错误,因此对于像我这样的 NGRX 新手来说,这是一个很难找到的。
【解决方案2】:

您不应该在构造函数中调用服务,这被认为是一种不好的做法。使用 ngOnInit() 方法订阅服务。该方法会在组件加载时自动调用。

这样试试,或许能解决你的问题。

import {Component, OnInit} from "@angular/core";

export class YourComponent implements OnInit{

    ngOnInit():void {
       //handle your subscription here
    }

}

【讨论】:

  • 不起作用。可能和ChangeDetectionStrategy有关?
  • 您的建议已经到位,但这并不能回答问题。在构造函数中放置计算只会延迟对象的实例化,并且您无法访问属性
  • @svarog,事实上它不会造成任何延迟,因为 observable 是异步的。正确的实现方法是icsapper建议的。
  • @JoJoB。您发布下一个事件的代码在哪里?你在使用 EventEmitter 吗?
  • @Pradeep 我不再使用此代码。在我的新代码中,我在需要时访问Store,而不是通过服务传递Observable
【解决方案3】:

如果更新属性并返回不会触发存储更新事件的相同对象,请确保从减速器返回一个新对象

switch (action.type) {

    case MAIN_MENU_TOGGLE : {

Ex return Object.assign({},appSettings, {isMainMenuExpand: flag}) }

【讨论】:

  • 我在做,不是这个问题
【解决方案4】:

我遇到了同样的问题,我发现原因是您编辑了状态,而不是为状态创建了新对象,例如:

执行:Object.assign({}, state, {smt: changed}) }

代替:Object.assign(state, {smt: changed}) }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-22
    • 2017-01-06
    • 2018-06-22
    • 2015-09-18
    • 2013-12-31
    • 1970-01-01
    • 2013-09-28
    • 2013-03-30
    相关资源
    最近更新 更多