无法使用Angular2 Subject在组件之间进行通信

时间:2017-08-25 19:21:22

标签: angular rxjs observable

我正在尝试使用Subject

在两个组件之间进行通信
private onAdd = new Subject<any>();
onAdd$ = this.onAdd.asObservable();

this.onAdd.next(event);

这些我写的服务:

我正在ngOninit

中的其他组件中这样听
this.service.onAdd$.subscribe((alert) => {
            console.log('Component---  ' + alert);
         });

两件事:

  1. this.onAdd.next(事件); ---&GT;未定义
  2. console.log('Component ---'+ alert); ----&GT;没有打印
  3. 所以,我可以保证我的活动没有传达给其他组件,我无法弄清楚问题是什么。任何人都可以帮助我。

2 个答案:

答案 0 :(得分:0)

除非您使用'ReplaySubject'或'BehaviorSubject',否则如果在组件订阅主题之前调用'next'方法,则在再次调用下一个方法之前,它将不会接收任何数据。

编辑 - 尝试这个简单的工作插件示例 - http://plnkr.co/edit/34Zj0QB5chEYj7g1vRmN

在plunkr中,您可以看到如果在订阅之前多次递增该值,则当您使用ReplaySubject点击订阅按钮时,您的组件将自动接收最后一个值。使用普通主题时,在您订阅时,只有再次单击“增量”按钮后才会显示该值。

如果你打电话

 this.onAdd.next(event);

在组件订阅它之后,它应该再次接收数据。

或尝试更改为重播主题,因此主题将在收到新订阅者时发送最后一个发布的值

 private onAdd = new ReplaySubject<any>();

请确保将其导入

 import { ReplaySubject } from 'rxjs/ReplaySubject';

答案 1 :(得分:0)

尝试像这样重构您的服务。 myService.service.ts

class MyService {
 private onAdd = new Subject<any>();

   sendonAdd(value) {
     this.onAdd.next(value);
   }
   getonAdd(){
    return this.onAdd.asObservable();
   }
}

现在在组件中注入此服务,您希望通过调用sendonAdd()来设置onadd值。在另一个组件中调用getonAdd()并订阅它。希望这可以帮助!如果有,请接受我的回答。