Angular2 fire 监听节点变化抛出错误

Angular2 fire listen to node changes throws an error

下面的代码可以正常工作,它应该监听节点中的变化并执行一个函数,但现在出现错误:

ncaught TypeError: Object(...) is not a function
at SwitchMapSubscriber.eval [as project] (changes.js:7)

所以,在我的 angular2 组件中我有:

private subscriptions = new Subscription();

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscriptions.add(
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
        )
    );
}

那么我哪里出错了,上面的错误指向:

angular2fire/database/list/changes

我需要我的代码做的是在 firebase 节点发生变化时监听并记录到控制台

订阅还定义为:

    private subscriptions = new Subscription();

将其添加到订阅中,然后我可以使用 onDestroy 生命周期并防止内存泄漏,如下所示

    ngOnDestroy() {
      this.subscriptions.unsubscribe();
    }

您似乎没有订阅列表,但 subscriptions 中只存储了一个订阅。尝试将其更改为这样的数组:

private subscriptions: Subscription[] = [];

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscriptions.push(
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
        )
    );
}

ngOnDestroy() {
   this.subscriptions.forEach((s) => s.unsubscribe());
}

使用 Subscription.add 您实际上是将 TeardownLogic 添加到现有订阅。这可以在您需要进行额外清理时使用。

如果您知道您将只有一个订阅,请使用赋值运算符 = 而不是 add() 函数,如下所示:

private subscription: Subscription;

registered: AngularFireList<any>;
constructor(private _af: AngularFireDatabase){
     this.registered = _af.list('/registered');
 }

ngOnInit() {
    this.subscription =
        this.registered.valueChanges().subscribe(
            res => {
                console.log("the value has changed");
            }
     );
}

ngOnDestroy() {
   this.subscription.unsubscribe();
}

这是最近很流行的问题。请将 rxjs 5 升级到版本 6。

发生这种情况是由于 AngularFire 中的一些重大更改。升级后,该功能应按预期执行。

升级使用:npm install rxjs@6 rxjs-compat@6 --save推荐

或回滚(不推荐)使用:

npm uninstall angularfire2
npm install angularfire2@5.0.0-rc.4
npm uninstall firebase
npm install firebase@4.8.0

请参阅 rxjs 官方 migration doc 了解操作方法以及有关 5 和 6 之间变化的更多详细信息。