取消父级的监听器是否适用于Firebase中的子级

时间:2015-06-16 18:50:37

标签: javascript firebase

我正在使用firebase在实时应用中同步数据。经过一些处理后,我想取消所有添加的听众链接。所以我把

myRef.off();

但我发现一些听众仍然依附。

我的问题是:当您将侦听器关闭为父节点时,它是否会传播给子节点,还是应该单独推迟每个级别?

3 个答案:

答案 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开发人员重回正轨!