【问题标题】:Why subject emits empty Array after change component RXjs Angular 2+为什么主题在更改组件 RXjs Angular 2+ 后发出空数组
【发布时间】:2018-01-11 17:00:42
【问题描述】:

我有一个问题,因为我不明白为什么 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;      
    });       
  }

它在我第一次使用组件构造函数“构造”服务时起作用。

constructor(private dataService: EventListService) { }

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

我检查 EventService 在他的变量中有“Events[]”,所以我不知道为什么 Subject 发出或不发出任何值。有谁知道发生了什么?

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    在您的服务中调用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);
        });
    }
    

    【讨论】:

    • 感谢您的解释。
    猜你喜欢
    • 1970-01-01
    • 2021-12-07
    • 1970-01-01
    • 2023-03-04
    • 1970-01-01
    • 2020-12-19
    • 2021-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多