【问题标题】:How did several subscription on one observable一个 observable 上的多个订阅是如何实现的
【发布时间】:2017-01-05 18:05:54
【问题描述】:

对不起我的英语。我有在主模块中提供的服务。何时使用setSettings 方法更改this.userSettings 对象我希望调用userSettingsObservable 上的所有订阅者。通过在该服务中调用getSettingsObservable 方法在不同的组件中进行订阅。

    constructor() {
        this.userSettingsObservable =  new Observable((observer: Observer<UserSettings>) => {
            this.userSettingsObserver = observer;
        });
    }

    getSettingsObservable() {
        return this.userSettingsObservable;
    }

    setSettings(path: string) {
        this.userSettings = _.set(this.userSettings, path, value);
        this.userSettingsObserver.next(_.clone(this.userSettings));
    }

组件中订阅 Observable 的示例:

ngOnInit() {        
    this.userSettingsService.getSettingsObservable().subscribe(
        (userSettings) => {
            this.userSettings = userSettings;
        }
    );
}

在我的情况下,仅在最后订阅的组件上订阅调用。 如何在我完成订阅的所有组件中进行订阅调用?

谢谢!

附:您可以在此处查看完整的服务代码:https://github.com/pakhuta/siarhei.pakhuta.angular2/blob/master/src/app/shared/user-settings.service.ts#L41

在这里订阅:https://github.com/pakhuta/siarhei.pakhuta.angular2/blob/master/src/app/weather/weather.component.ts#L43

【问题讨论】:

  • 问题不清楚。当您 userSettingObserver.next 时,问题是不是所有订阅者都能获得价值?
  • 是的,你是对的。我有几个组件在其中完成了订阅。如果我在 Chrome 开发者控制台中设置断点,那么只有一个(最后订阅的)组件脚本执行会停止。
  • 你是在注入还是导入服务?
  • 另外,你是从哪里调用 setSettings 的?
  • 您是在注入还是导入服务?我不知道它是如何正确调用的。在我写这个的组件中: constructor(private userSettingsService: UserSettingsService) setSettings 我在组件中调用,例如当用户点击设置菜单中的项目时

标签: angular observable


【解决方案1】:

我的猜测是这是一个时间问题,并且 observable 在其他组件订阅之前完成。

最简单的解决方案是使用 BehaviorSubjectReplaySubject 而不是常规的 observable。

constructor() {
        this.userSettingsObservable =  new ReplaySubject(1);//will only broadcast the last value when subscribed to
    }

然后:

this.userSettingsObservable.onNext(settings)

【讨论】:

  • 谢谢,我明天试试
  • 你是对的。这是一个伟大的决定。我用过:this.userSettingsObservable = new BehaviorSubject(this.userSettings); this.userSettingsObservable.next(_.clone(this.userSettings));
  • 一般来说,主题是不受欢迎的,因为他们“是邪恶国家的小口袋”,套用 rxjs 的作者的话。话虽如此,有时它们是不可避免的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多