未在可观察的创建上分配订阅者

时间:2018-11-20 05:03:40

标签: angular events rxjs observable

我正在用代码执行此操作,以便处理来自多个组件的多个视图

https://stackblitz.com/edit/angular-cy8jza  (检查控制台中的错误)

export class ViewGroup {
    _onViewChanged: any;
    OnViewChanged$ : Observable<any>;
    _onViewAdded: any;
    OnViewAdded$ : Observable<any>;
    _onViewRemoved: any;
    OnViewRemoved$ : Observable<any>;

    viewsSet = new Set<string>();
    currentView = "";
    previousView = "";

    constructor(){
    this.OnViewChanged$ = Observable.create(obs => this._onViewChanged = obs);
    this.OnViewAdded$ = Observable.create(obs => this._onViewAdded = obs);
    this.OnViewRemoved$ = Observable.create(obs => this._onViewRemoved = obs);
}
}

我在代码中的位置

this._availableView.set(name,  new ViewGroup());

然后致电

this._availableView.get(group)._onViewAdded.next(view);

但是我无法调用下一个,这是未定义的。

程序完全相同

this.onGroupAdded$ = Observable.create(e => this._onGroupAdded = e)

但是这可以在堆栈闪电中起作用。

编辑:我发现,在我订阅它之前,不会调用我在创建过程中传递的方法。我必须这样做才能使一切正常:

this.OnViewChanged$ = Observable.create((obs) => {this._onViewAdded = obs});
this.OnViewAdded$ = Observable.create((obs) => {this._onViewAdded = obs});
this.OnViewRemoved$ = Observable.create((obs) => {this._onViewAdded = obs});
this.OnViewChanged$.subscribe();
this.OnViewAdded$.subscribe();
this.OnViewRemoved$.subscribe();

有什么办法可以避免呢?

1 个答案:

答案 0 :(得分:2)

如果我正确理解您的情况,我认为您正在寻找的是主题。

您是正确的,可观察对象只有在被订阅后才能运行。您可以在各种文档中找到许多对此的引用,例如:angular docs for observables

因此,与其使用create方法创建可观察对象。尝试将它们声明为主题。有关更多详细信息,请在此处查看如何在angular文档中使用它们:https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service