为什么当 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
.
这样的辅助变量
我正在使用 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
.