为什么主题在更改组件RXjs Angular 2+后发出空数组

时间:2018-01-11 17:00:43

标签: angular rxjs observable

我遇到了问题,因为我不明白为什么Subject会发出空数据。 我有一个基础,我从这里得到数据到这样的服务:

 eventChanged = new Subject<any>(); 

 constructor(private http: HttpClient) { 
     this.http.get<Event[]>(this.baseUrl)
       .subscribe(events => { 
          this.events = events
          this.eventChanged.next(this.events.slice());
       });
      }
  getEvents(): Observable<any> {
    return this.eventChanged.asObservable();
  }

我的组件在ngOnInit()

中观察该主题
ngOnInit() {
    this.dataService.getEvents()
    .subscribe(
    (events) => {
      this.events = events;      
    });       
  }

它适用于我第一次构建&#34;使用组件构造函数的服务。

constructor(private dataService: EventListService) { }

但是当我更改视图组件然后返回给他时,我收到空this.events

我检查EventService是否有&#34; Events []&#34;在他的变量中,所以我不知道为什么主体发出或不发出任何值。谁知道发生了什么事?

1 个答案:

答案 0 :(得分:0)

在您的服务中constructor被调用后,它会提取数据并通过主题发送它们并将它们保存在events属性中。

ngOnInit中,您可能已经订阅了Subject,因此您会收到这些数据。但这是发出这些内容的最后一刻(因为服务的constructor未被再次调用)。

虽然您尝试在events属性中保存数据。你不要在任何地方使用它们。

如果您希望将数据保留在服务中并能够随时获取它们。您可以使用BehaviorSubject来记住最后一个值。

eventChanged = new BehaviorSubject<any>([]); 

constructor(private http: HttpClient) {
  this.refetch();
}

getEvents(): Observable<any> {
  return this.eventChanged.asObservable();
}

refetch(): void {
  this.http.get<Event[]>(this.baseUrl)
    .subscribe(events => 
       this.eventChanged.next(events);
    });
}