Angular2 - 订阅不开火

时间:2017-06-06 13:21:44

标签: angular

我正在尝试实现共享服务,以便在组件之间共享信息。

在这一刻,订阅不起作用,我不知道为什么......

这是服务:

服务

private subject = new Subject<any>();

getCurrentUser(): Observable<any> 
    {

        this.subject.next({data:"test"});
        return this.subject.asObservable();
    }

成分

subscription: Subscription;

ngOnInit() {


    this.subscription = this.authService.getCurrentUser().subscribe(data => { 

      this.message = data;
      alert('I called the method');

    });    
  }

此时执行没有进入设置消息的过程并执行警报...

感谢支持

3 个答案:

答案 0 :(得分:3)

那是因为你没有按照它使用的方式使用ObservableObservable基本上是一个数据流,而你&#39 ;在订阅流之前重新发出数据。

private subject = new Subject<any>();

getUserObservable(): Observable<any> 
{
    return this.subject.asObservable();
}

setUser(user:any):void{
    this.subject.next(user);
}

在你的测试中:

订阅:订阅;

  ngOnInit() {
    this.subscription = this.authService.getCurrentUserObservable().subscribe(data => { 
      this.message = data;
      alert('I called the method');
    });
    // The subscription will be called right here.
    this.authService.setUser({data:"test"});
  }

然后,如果您从其他组件,服务或其他内容中调用setUser,您的订阅将被调用。

答案 1 :(得分:1)

您的主题在您订阅之前会发出该值。这就是一个主题如何运作。您可以使用BehaviorSubject。 BehanvoirSubject重新发送该值,但采用默认值:

private subject = new BehaviorSubject<any>(undefined);

如果那不是您想要的,您可以使用地图:

return this.subject.asObservable().map(value => !isNullOrUndefined(value))

答案 2 :(得分:1)

在您的示例/测试中尝试将主题更改为BehaviorSubject

private subject = new BehaviorSubject<any>({date: "test"});

然后将getCurrentUser更改为

getCurrentUser(): Observable<any> {
   return this.subject.asObservable();
}

subject和behaviorSubject之间的一个重要区别是你必须为behaviorSubject提供一个起始值,并且当你订阅它时它也会向你发出当前值。当您订阅时,主题不会向您发出最后设定值,它只会在您订阅的点开始“观察”并接收后续更改。