我正在用代码执行此操作,以便处理来自多个组件的多个视图
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();
有什么办法可以避免呢?
答案 0 :(得分:2)
如果我正确理解您的情况,我认为您正在寻找的是主题。
您是正确的,可观察对象只有在被订阅后才能运行。您可以在各种文档中找到许多对此的引用,例如:angular docs for observables。
因此,与其使用create方法创建可观察对象。尝试将它们声明为主题。有关更多详细信息,请在此处查看如何在angular文档中使用它们:https://angular.io/guide/component-interaction#parent-and-children-communicate-via-a-service。