Firebase会触发所有集合项,而只有一个已更新

时间:2018-02-11 18:10:08

标签: javascript firebase firebase-realtime-database triggers

每当我使用具有相同值和属性的相同对象(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)

1 个答案:

答案 0 :(得分:1)

这些事件很可能直接来自客户端SDK,它不会检测是否存在实际更改。数据库服务器执行执行此类检查,并且只有在实际更改时才会向其他客户端发送更改。

更新

当您通过呼叫告知其将节点更新为其当前值时,Firebase客户端+服务器的行为方式如下。

  1. 客户端触发本地事件以反映更新。所以child_changed会开火。
  2. 客户端将更新发送到服务器。这是必需的,因为客户端和服务器可能(略微)不同步,并且服务器是单一来源的。
  3. 服务器将更新与节点的当前值进行比较。如果它是相同的,则该过程在此处停止。
  4. 如果更新的值与当前值不同并通过验证/权限检查,则数据将提交到磁盘并广播给任何活动的侦听器。
  5. 如果更新值不同,但被验证/权限检查拒绝,则服务器会向原始客户端发送拒绝消息,然后发送另一个child_changed事件以还原本地更改。