如何在一个可观察的几个订阅

时间:2017-01-05 18:05:55

标签: angular observable

抱歉我的英文。我有主要模块提供的服务。如果确实发生了使用this.userSettings方法更改setSettings对象,我希望调用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;
        }
    );
}

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

谢谢!

P.S。您可以在此处查看完整的服务代码: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

1 个答案:

答案 0 :(得分:1)

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

最简单的解决方案是使用<ion-input type="text" placeholder="rechercher" [(ngModel)]="findItem" (input)='findContact($event.target.value)'> BehaviorSubject而不是常规的observable。

ReplaySubject

然后:

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