snap.ref.remove()正在删除父节点中的所有节点而不仅仅是它自己

时间:2015-05-14 12:22:58

标签: firebase

我只是想删除前2个节点,但它会删除整个分支。如果我注释掉remove(),它会正确地控制前两个节点的console.log,但是当我取消注释remove()时,它会删除该messagesRef中的所有节点,而不仅仅是前2个节点。

messagesRef.limitToFirst(2).on('child_added', function (snap) {
    snap.ref().remove();
    console.log(snap.val());

});

3 个答案:

答案 0 :(得分:2)

这是因为一旦你删除了一个,现在就有一个" new" child_added到2的限制。所以它会一直循环遍历它们,直到它们都被删除。

Child 1
Child 2

->>delete child 1

Child 2
Child 3 ->new child_added event

etc...

要解决这个问题,你可以保留一个柜台:

var numRemoved = 0; 
var ref = messagesRef.limitToFirst(2);
ref.on('child_added', removeFirstTwoChildren);
removeFirstTwoChildren(snap){
    snap.ref().remove();
    console.log(snap.val());
    numRemoved++;
    if(numRemoved === 2){
        ref.off('child_added', removeFirstTwoChildren);
    }
}

答案 1 :(得分:1)

@ MatthewBerg的答案会很有效。如果您只想删除一些用户,另一种选择是:

var ref = messagesRef.limitToFirst(2);
ref.once('value', function(twovaluesnapshot) {
  twovaluesnapshot.forEach(function(snapshot) {
    snapshot.remove();
  });
});

虽然我通常不鼓励使用oncevalue来获取商品列表,但这似乎是一个合理的用例。

答案 2 :(得分:0)

您的messagesRef和messagesRef.limitToFirst(2).ref()您可以查看相同的路径。

尝试以下操作会发生什么?

messagesRef.limitToFirst(2).on('child_added', function (snap) {
    console.log(snap.val());
    snap.forEach(function(data) {
        console.log("The message key :" + data.key() );
        messagesRef.child(data.key()).remove();
    });
});