为什么当 observable 更新时我订阅的变量不更新?

Why doesnt my subcribed variable update when observable is updated?

我正在使用 angular 5.2.9 和 angularfire 访问我的 firestore 数据库。当我在 load.service.ts 上调用一个函数时,它运行以下函数块,参数为 status 和 returns 一个可观察的; this 被分配给调用组件中的一个可观察对象。如果您第一次导航到该组件,这将非常有效,因为默认状态为 "Active"。如果您将状态设置为 "Complete" 我没有得到任何结果。

*****************Component.ts ****************

//this is inside the constructor
private loads = new BehaviorSubject<Load[]>(new Array<Load>());
public currentLoads = this.loads.asObservable();

this.userService.currentUser.subscribe(user => {
  this.user = user;
  //loadsService depends on user
  this.loadsObservable = this.loadService.getLoads("Active");
  this.loadsObservable.subscribe(loads => {
    this.loads = loads;
  });
});


//this gets fired by a button group  
onChangeFilter(event: any){
  this.loadsObservable = this.loadService.getLoads(this.currentStatus);
}

*************** load.service.ts *****************

getLoads(status: string){
  const loadCollection = this.afs.collection<Load>('loads');
  loadCollection.ref.where("status", "==", status).where("driver/id","==", this.user.id)
  return loadCollection.valueChanges();
});

那是因为在 onChangeFilter 中您交换了在 this.loadsObservable 中的引用,但您只订阅了构造函数中的第一个。第二个未订阅,因此发出的项目永远不会出现在您的视图中。

我假设您在带有 async 管道的模板中使用 currentLoads。在那种情况下,你可以直接在 onChangeFilter 中有例如。此代码:

onChangeFilter(event: any) {
  this.currentLoads = this.loadService.getLoads(this.currentStatus)
                                      .switch();
}

这样你就可以从外部 Observable 中获取内部 Observable(负载本身),你可以从 getLoads 调用中获得。每次外部发射时,由于 switch 运算符,对先前内部 Observable 的订阅被丢弃,更多关于 here。使用这种方法,您不需要手动订阅或像 private loads.

这样的辅助变量