Unlink listener for parent does it applied to children in Firebase

后端 未结 3 1938
隐瞒了意图╮
隐瞒了意图╮ 2020-12-19 12:08

I am using firebase to synch data in a real time app. After some treatment, I want to unlink all listeners added. So I put

myRef.off();

But

相关标签:
3条回答
  • 2020-12-19 12:33

    Thanks to the posts in this thread, I was able to figure out how stop my callbacks which kept firing after their initial invocation for the intended Firebase calls they were passed to. This unexpected callback was even happening when I updated directly in the console.

    I got the following solution to disengage listeners once the callback runs:

    var queryRef = someItemRef.limitToLast(1);
    
    queryRef.on('child_added', function (data) {
    
        queryRef.off();
        onAddSomeItemReadyFunc(data);
    });
    

    For me - understanding the listener logic and avoiding "rogue callbacks" - has been a trickier aspect of working with Firebase DB. But we're gettn' there :)

    @Frank van Puffelen, thank you yet again for good notes and examples to help us Firebase-client devs get back on track!

    0 讨论(0)
  • 2020-12-19 12:39

    Detach a callback previously attached with on(). Note that if on() was called multiple times with the same eventType and callback, the callback will be called multiple times for each event, and off() must be called multiple times to remove the callback.

    This comes from the firebase docs on the off() method (link).

    So if i read this correct you have to call off() for every on() you did.

    0 讨论(0)
  • 2020-12-19 12:42

    Let's try it.

    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');
    

    The output:

    parent: "1"
    child: "2"
    parent: {"child":"2"}
    child: "3"
    

    So after calling off on the parent listener, the child listener still fires ("3"). But if we get the same child and call off, it doesn't for anymore ("4").

    JSBin: http://jsbin.com/wutaza/edit?js,console

    Conclusion: off() doesn't remove listeners from child nodes.

    0 讨论(0)
提交回复
热议问题