下面的代码正在运行,它应该监听节点中的更改并执行一个函数,但现在出现错误:
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();
}
答案 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.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();
}