我只是想删除前2个节点,但它会删除整个分支。如果我注释掉remove(),它会正确地控制前两个节点的console.log,但是当我取消注释remove()时,它会删除该messagesRef中的所有节点,而不仅仅是前2个节点。
messagesRef.limitToFirst(2).on('child_added', function (snap) {
snap.ref().remove();
console.log(snap.val());
});
答案 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();
});
});
虽然我通常不鼓励使用once
和value
来获取商品列表,但这似乎是一个合理的用例。
答案 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();
});
});