我有 2 个服务。在一个中,我想订阅以检测另一个服务中的字符串是否更改,以便在每次更改时从数据库加载。
第一个服务:(使用的 session 值是对第二个服务的引用)
subscribeStringChange() {
this.session.uid.subscribe(x => {
console.log(this.session.uid);
return this.af.database.list('items', {
query: {
orderByChild: 'uid',
equalTo: this.session.uid
}
});
});
}
这是第二个服务和我尝试过的:
uid: Observable<string> = Observable.of('');
constructor(private auth: FirebaseAuth, private af: AngularFire) {
this.auth.subscribe(user => {
if (user) {
this.uid = Observable.of(user.uid);
console.info('logged in');
} else {
this.uid = Observable.of('');
console.info('logged out');
}
});
}
最佳答案
你可以使用 BehaviorSubject
,它既像生产者又像消费者(或者更准确地说,像观察者和可观察者)。在使用 firebase 的一侧,您将在生产者一侧执行操作,发出新值,而在另一侧,您只是保持不变
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
private _uid = new BehaviorSubject<string>('');
uid = this._uid.asObservable();
constructor(private auth: FirebaseAuth, private af: AngularFire) {
this.auth.subscribe(user => {
if (user) {
this._uid.next(user.uid);
console.info('logged in');
} else {
this.uid.next('');
console.info('logged out');
}
});
}
注意 this._uid.next('')
。在这里,您发出了一个新值,订阅者将收到它。
您无需更改其他服务中的任何内容。好吧,实际上你知道。您正在尝试访问可观察的 uid
,而您应该只使用传递给订阅回调的值 x
this.session.uid.subscribe(x => {
console.log(x);
return this.af.database.list('items', {
query: {
orderByChild: 'uid',
equalTo: x
}
});
});
关于Angular 2 如何使用 observable 检测字符串变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40522394/