每当我使用具有相同值和属性的相同对象(s3)进行更新时,即使没有任何要添加或更新的内容,Firebase也会触发事件'child_added'。 我通过在firebase控制台上修改主对象的子集合中的一些值进行了一些测试,并注意到它返回第一个元素正确的快照,然后将集合的所有其他元素作为“ADDED”元素。这不是真的,因为除了我执行动作的集合之外,集合没有改变。
我只需要在发送存储在数据库中的相同对象时,firebase会巧妙地识别出没有请求任何操作,并且不需要激活触发器。
var studentiRef = ref.child('studenti/' + s3.matricola);
studentiRef.update(JSON.parse(JSON.stringify(s3)));
studentiRef.on("child_changed", function(userSnapshot) {
var tasseRef = userSnapshot.ref.child('tasse');
tasseRef.on('child_added', function(itemSnapshot, prevKey){
console.log('ADDED ON');
console.log(itemSnapshot.key)
})
});
studentiRef.on("child_changed", function(userSnapshot) {
userSnapshot.ref.child('tasse').on('child_removed', function(itemSnapshot, prevKey){
console.log('REMOVED ON');
console.log(itemSnapshot.key)
})
});
studentiRef.on("child_changed", function(userSnapshot) {
userSnapshot.ref.child('tasse').on('child_changed', function(itemSnapshot, prevKey){
console.log('CHANGED ON');
console.log(itemSnapshot.key)
})
});
更新:
在发布更新之前,我做了一些没有成功结果的实验。 这里是控制台,数据库和代码的图片。 坚持这个。 这里有三个屏幕截图:1 firebase data 2 snippet 3 console log
更新II: scenario
behaviours on modifying value in firebase
解决: 通过从github firebase示例中获得灵感,我发现使用firebase时常见的错误:我没有平坦化数据。 要继续使用我的数据结构(对象列表中的根对象),解决方案是触发每个对象的更新(伪代码:ref.update(root / childobject)n次而不是ref.update(root) 。 如果其他人遇到这个问题,我会更好地解释。 永远,平衡你的数据! (使用firebase)
答案 0 :(得分:1)
这些事件很可能直接来自客户端SDK,它不会检测是否存在实际更改。数据库服务器执行执行此类检查,并且只有在实际更改时才会向其他客户端发送更改。
更新
当您通过呼叫告知其将节点更新为其当前值时,Firebase客户端+服务器的行为方式如下。
child_changed
会开火。child_changed
事件以还原本地更改。