我正在使用firebase在实时应用中同步数据。经过一些处理后,我想取消所有添加的听众链接。所以我把
myRef.off();
但我发现一些听众仍然依附。
我的问题是:当您将侦听器关闭为父节点时,它是否会传播给子节点,还是应该单独推迟每个级别?
答案 0 :(得分:7)
试试吧。
ref.on("value", function(snapshot) {
console.log("parent: "+JSON.stringify(snapshot.val()));
});
ref.child("child").on("value", function(snapshot) {
console.log("child: "+JSON.stringify(snapshot.val()));
});
ref.set('1');
ref.child('child').set('2');
ref.off();
ref.child('child').set('3');
ref.child('child').off();
ref.set('4');
输出:
parent: "1"
child: "2"
parent: {"child":"2"}
child: "3"
因此,在父侦听器上调用off
之后,子侦听器仍然会触发("3"
)。但是,如果我们得到同一个孩子并致电off
,则不再适用"4"
。
JSBin:http://jsbin.com/wutaza/edit?js,console
结论:off()不会从子节点中删除侦听器。
答案 1 :(得分:1)
分离以前用on()附加的回调。请注意,如果使用相同的eventType和callback多次调用on(),则会为每个事件多次调用回调,并且必须多次调用off()以删除回调。
这来自off()方法(link)上的firebase文档。
因此,如果我读到这个正确的话,你必须为你所做的每一次on()调用off()。
答案 2 :(得分:0)
感谢这个帖子中的帖子,我能够弄清楚如何停止我们的回调,这些回调在他们被传递到的目标Firebase调用的初始调用之后仍然会被触发。当我直接在控制台中更新时,甚至发生了这种意外的回调。
一旦回调运行,我得到了以下解决方案来解除侦听器:
var queryRef = someItemRef.limitToLast(1);
queryRef.on('child_added', function (data) {
queryRef.off();
onAddSomeItemReadyFunc(data);
});
对我来说 - 理解听众逻辑并避免“流氓回调” - 一直是使用Firebase DB的一个棘手的方面。但我们得到了那里:)
@Frank van Puffelen,再次感谢您提供优秀的笔记和示例,以帮助我们Firebase-client开发人员重回正轨!