use*_*638 4 javascript firebase
我创建了这个处理程序来监视正在创建的新子项。这个小技巧会阻止 child_ added 事件在每个页面加载时触发我的代码。相反,它只有在实际添加某些内容时才会被触发。
// Listen for new rooms being created
var first_room_added_after_load = true;
this._roomRef.endAt().limit(1).on('child_added', function(snapshot){
if (first_room_added_after_load) { // we want to skip the first room, because it will already exist
first_room_added_after_load = false;
return;
}
else {
this._onCreateRoom(snapshot);
}
}, this);
Run Code Online (Sandbox Code Playgroud)
也就是说,当我在 _roomRef 中的节点上调用 remove() 时,会为已经存在的节点触发 child_ added 。关于为什么以及如何阻止它的任何提示?
我还应该提到,这似乎只有在我删除在列表中已有的其他内容之后创建的内容时才会发生。如果我先删除旧项目,则不会触发 child_ added。
您似乎认为endAt()使用时间戳进行比较,因此它只返回新的孩子。但这根本不是它的工作原理。来自Firebase 文档endAt:
如果未提供任何参数,则结束点将是数据的结尾。
使用您的代码:
this._roomRef.endAt().limit(1)
Run Code Online (Sandbox Code Playgroud)
您正在创建一个设置为始终返回单个子项的查询。条件是在您创建查询之后创建了子项。
查询就像 Firebase ref 中子节点上的滑动窗口:它始终(最多)包含一个子节点,即在您创建查询后创建的子节点。
假设您在创建查询时有这些孩子:
child1
child2
child3 <!-- last child present when creating the endAt() query -->
Run Code Online (Sandbox Code Playgroud)
通过使用endAt查询将在child3. 所以它不会为child1,child2和触发任何事件child3。
假设您添加了一个新孩子:
child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4
Run Code Online (Sandbox Code Playgroud)
查询将是一个child_added事件child4。
现在,如果我们添加另一个孩子:
child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4
child5
Run Code Online (Sandbox Code Playgroud)
查询将触发child_removedforchild4和child_addedfor child5。请注意,child4它实际上并未从您的 Firebase 中删除,它只是从查询结果中消失了(因为您要求将结果数量限制为一个)。
当我们现在删除最新的孩子时,我们最终得到:
child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4
Run Code Online (Sandbox Code Playgroud)
并且查询将触发child_removedforchild5和child_addedfor child4。这再次来自这样一个事实,即您的查询设置为始终包含(最多)一个在 之后添加的节点child3。
似乎您只想child_added为新添加的孩子获得一次。在这种情况下,我不会limit在查询中使用 a ,而是将创建房间的时间戳设置为其优先级:
this._roomRef.push({
/* whatever properties you need for a room */,
'.priority': Firebase.ServerValue.TIMESTAMP
})
Run Code Online (Sandbox Code Playgroud)
然后您可以简单地以该优先级开始查询。
this._roomRef.startAt(Date.now()).on('child_added', ...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
466 次 |
| 最近记录: |