Angular 2 如何使用 observable 检测字符串变化

标签 angular rxjs

我有 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/

相关文章:

angular - 从浏览器控制台中删除错误消息(Angular HttpClient)

RxJs:Subjects 和 Observable-Multicasting 有什么区别

angular - 要求选中一个复选框

html - Angular Material mat-slide-toggle 切换仅适用于第一个组件

angular - 如何使用带有参数的选择器从效果中的ngrx存储中选择

javascript - rxjs 中的 Observable 和 Subject 有什么区别?

javascript - throttleTime 运算符的配置参数如何工作? ( throttle 配置)

javascript - 在测试中执行函数 n 次并检查 jasmine 异步代码中的每个结果的智能方法

javascript - 当我使用 ngFor 动态创建标签时,鼠标悬停无法正常工作

angular - 未定义未捕获的引用输入 - @Input() 在 Angular 2 中不起作用