我使用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();
});
答案 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
之类的辅助变量。