为什么在更新observable时我的subcribed变量不会更新?

时间:2018-04-01 09:17:32

标签: angular firebase angularfire2 rxjs5

我使用angular 5.2.9和angularfire来访问我的firestore数据库。当我在load.service.ts上调用一个函数时,它运行以下带有参数status的函数块并返回一个observable;这被分配给调用组件中的一个observable。由于默认状态为“活动”,因此第一次导航到组件时,这非常有效。如果您将状态设置为“完成”,则不会得到任何结果。

***************** 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();
});

1 个答案:

答案 0 :(得分:0)

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

我假设您在模板中使用currentLoads async管道。在这种情况下,您可以直接在onChangeFilter中拥有例如。这段代码:

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

这样你从外部Observable得到内部Observable(加载本身),你从getLoads调用中得到。每次外部发出时,由于switch运算符,对here运算符的删除会更多地删除对前一个内部Observable的预订。使用这种方法,您无需手动订阅或拥有private loads之类的辅助变量。