【发布时间】:2017-10-31 08:00:54
【问题描述】:
我是 rxjs 新手,所以想问一个关于 Angular 2、Observables 和 BehaviorSubject/Subject 的问题。
所以,我想要实现的是:button 中的onclick ComponentA 以通知其他组件,例如ComponentB、ComponentC。
到目前为止我所做的是创建一个service:
private isMenuOpenBS = new BehaviorSubject(false);
toggleMenu(): void {
this.isMenuOpenBS.next(!this.isMenuOpenBS.getValue());
}
getMenuState(): Observable<boolean> {
return this.isMenuOpenBS.asObservable();
}
然后拥有一个带有provide menuService 的组件正在调用this.menuService.toggleMenu(),这会改变BehaviorSubject 的值。代码:
toggleMenu(): void {
this.menuService.toggleMenu();
this.menuService.isMenuOpenBS.subscribe(
(data) => {
console.log(data)
},
(e) => {console.log(e)},
() => {console.log('completed')}
)
}
还有另一个组件,OnInit() subscribes 到 getMenuState(),这是一个 Observable,但它仅在 OnInit() 上获取值。代码:
ngOnInit(): void {
this.menuService.getMenuState().subscribe(
(data)=>{
this.messages = data;
console.log('nav component');
},
(e) => {console.log(e)},
() => {console.log('completed')}
)
}
complete 函数永远不会被调用。
任何想法我做错了什么或者我在逻辑中遗漏了什么?
--
编辑:所以,为了解释更多问题,我可以看到 observable 具有 oninit 的第一个值,但没有别的。之后没有错误没有完成,或者没有“下一个”值,这是错误的,因为我从主题发送了新值。最终问题出在组件的提供者列表上,而不是 observables 或 subject 的问题,但在解决问题之前,很难看出问题所在。
【问题讨论】:
-
你在哪里“完成” observable?
-
无处可去。那是缺少的吗?在我看来,我在想我不想
complete它,所以它可以一直获得价值。或者我每次获取值时都必须complete它,这样它才能在另一个组件调用toggle方法之后获取新的值? -
这就是你所缺少的。如果你完成了这个主题,observable 就会死掉。
-
所以我必须在某个地方打电话给
complete()?对不起,我有点困惑,是否可以在代码中写下我应该在哪里做?基本上,我有 1 个shared service和 2 个components。 -
为什么要完成observable?如果这样做,您将无法
next值
标签: angular observable angular2-services angular2-observables behaviorsubject