我最初有以下数据:
"holidays": {
...
"2016-12-19": {
"stegosaurus": true
},
"2016-12-20": {
"lambeosaurus": true,
"stegosaurus": true
},
"2016-12-21": {
"lambeosaurus": true
},
...
}
使用以下查询
ref.orderByKey().startAt("2016-12-18")
.endAt("2016-12-18")
.on("child_added", function(snapshot) {
console.log("child_added")
});
ref.orderByKey().startAt("2016-12-18")
.endAt("2016-12-18")
.on("child_removed", function(snapshot) {
console.log("child_removed")
});
ref.orderByKey().startAt("2016-12-18")
.endAt("2016-12-18")
.on("child_changed", function(snapshot) {
console.log("child_changed")
});
ref.orderByKey().startAt("2016-12-18")
.endAt("2016-12-18")
.on("child_moved", function(snapshot) {
console.log("child_moved")
});
在初始添加新节点“2016-12-18”到“假期”节点时,我收到child_added
个事件。当节点“2016-12-18”被删除时,我收到child_removed
个事件。但是当我再添加“2016-12-18”时,这次我没有收到任何活动。这是一个firebase错误吗?
这是一个重复此问题的jsbin: https://jsbin.com/sefaha/6/edit?html,console,output
重现:
1) On reload, Click Update button
2) Dino info is displayed
3) Click Delete button
4) Dino info is removed
5) Click Update button
6) Dino info is not displayed anymore
7) Reload/refresh browser
8) Dino info is displayed
9) Click Delete button
10) Repeat step (1)
请注意,在步骤(1)中,有时不会显示dino信息。它似乎取决于连接的客户端数量。
答案 0 :(得分:1)
使用深度更新重新添加先前在同一会话中删除的节点时确实存在错误。它已经在Firebase数据库服务器中隐藏了很长时间,可以使用此代码段重现:
var query = ref.orderByKey().startAt("2017-01-13").endAt("2017-01-13");
// attaching this listener makes it work
//ref.on("value", function(s) { console.log("value", s.val() )});
query.on("child_added", function(snapshot) { console.log("child_added"); });
query.on("child_removed", function(snapshot) { console.log("child_removed"); });
query.on("child_changed", function(snapshot) { console.log("child_changed"); });
query.on("child_moved", function(snapshot) { console.log("child_moved"); });
function _update() {
console.log("updating child");
ref.update({'2017-01-13/-KaMFzShw40MkBtMypUg': true });
// using this way of setting the value makes it work
//ref.child('2017-01-13/-KaMFzShw40MkBtMypUg').set(true);
};
function _delete() {
console.log("deleting child");
ref.update({'2017-01-13/-KaMFzShw40MkBtMypUg': null});
};
完成jsbin:https://jsbin.com/zedojum/edit?html,console,output
您可以使用set()
代替更新来直接更新较低级别的子级,或者通过将侦听器连接到该位置(而不是查询)来解决此问题。
我会在这里发布修复后的说明。