【发布时间】:2017-10-30 09:42:09
【问题描述】:
在 Angular4 中使用 Rxjs 的问题
RxJS 版本: 5.5.0
重现代码:
服务
subject= new AsyncSubject<String>();
subject.next(data);
subject.complete();
组件
ngOnInit(){
subject.subscribe();
}
预期行为: 只接收一次数据,然后清理主题中的数据,不再接收或强制取消订阅主题。
实际行为: 在服务中,我有 asyncSubject 发出一些数据。在某些组件中,我订阅了我的 asyncSubject,数据来自每个组件初始化。我尝试取消订阅主题,但在下一次组件初始化后它再次订阅。
附加信息: 角度版本 4.4.6 Chrome 版本 61
仪表板组件:
constructor(private userEvents: UserEvents,) {}
ngOnInit() {
this.successLogged();
}
successLogged() {
this.userEvents.successLoggedObservable.subscribe(message => {
console.log("WORK");
});
}
用户事件:
private successLoggedObservable = new AsyncSubject<String>();
get successLogged() {
return this.successLoggedObservable;
}
登录组件:
this.userEvents.successLoggedObservable.next("MESSAGE");
this.userEvents.successLogged.complete();
this.stateService.go('dashboard');
【问题讨论】:
-
所以让我说对了,你想触发一个事件,然后从登录导航到仪表板并在那里接收一个事件?您要么必须使用
Async或Replay主题并修复您的用例,要么使用其他形式的组件通信,例如router params。你这里的逻辑没有意义。 -
在我登录 LoginComponent 后,我想将登录成功消息传递给 DashboardComponent。你知道我怎样才能达到它吗?
-
正如我所说,如果您使用路由器导航到仪表板组件,您可以使用路由器参数向它发送数据。
-
我使用路由参数解决它。谢谢!
标签: javascript angular rxjs observable