Angular2 fire监听节点更改会引发错误

时间:2018-06-05 12:53:46

标签: javascript firebase firebase-realtime-database angularfire2

下面的代码正在运行,它应该监听节点中的更改并执行一个函数,但现在出现错误:

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();
    }

2 个答案:

答案 0 :(得分:2)

这是当今流行的问题。请将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之间的更改的操作方法和更多详细信息。

答案 1 :(得分:0)

似乎您没有订阅列表,而只有一个订阅存储在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.addTeardownLogic添加到现有订阅中。当您需要进行其他清理工作时,可以使用此功能。

如果您知道只有一个订阅,请使用赋值运算符=代替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();
}