gpt4 book ai didi

javascript - child_added 在删除后被触发

转载 作者:行者123 更新时间:2023-11-29 10:14:37 25 4
gpt4 key购买 nike

我创建了这个处理程序来监视正在创建的新子项。这个小技巧阻止 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);

就是说,当我在 _roomRef 中的一个节点上调用 remove() 时,就会为一个已经存在的节点触发 child_added。关于为什么以及如何阻止它的任何提示?

我还应该提到,这似乎只有在我删除列表中已经存在的其他内容之后创建的内容时才会发生。如果我先删除旧项目,则不会触发 child_added。

最佳答案

您似乎认为 endAt() 使用时间戳进行比较,因此它只返回新的 child 。但这根本不是它的工作原理。来自Firebase documentation for endAt :

If no arguments are provided, the ending point will be the end of the data.

使用您的代码:

this._roomRef.endAt().limit(1)

您正在创建一个设置为始终返回单个子项的查询。条件是子项是在您创建查询后创建的。

查询就像 Firebase ref 中子节点上的滑动窗口:它总是(最多)包含一个子节点,该子节点是在您创建查询后创建的。

例子

假设您在创建查询时有这些 child :

child1
child2
child3 <!-- last child present when creating the endAt() query -->

通过使用 endAt 查询将在 child3 之后“ Root ”。因此它不会为 child1child2child3 触发任何事件。

假设您添加了一个新 child :

child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4

查询将为 child4 生成一个 child_added 事件。

现在如果我们添加另一个 child :

child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4
child5

查询将为 child4 触发 child_removed 并为 child5 触发 child_added。请注意,child4 实际上并没有从您的 Firebase 中删除,它只是从查询结果中消失了(因为您要求将结果数限制为一个)。

当我们现在删除最新的孩​​子时,我们最终得到:

child1
child2
child3 <!-- last child present when creating the endAt() query -->
child4

查询将为 child5 触发 child_removed 并为 child4 触发 child_added。这又是因为您的查询设置为始终(最多)包含一个在 child3 之后添加的节点。

如何得到你想要的

您似乎只想为新添加的 child 获取一次 child_added。在这种情况下,我不会在查询中使用 limit,而是将创建房间的时间戳设置为优先级:

this._roomRef.push({
/* whatever properties you need for a room */,
'.priority': Firebase.ServerValue.TIMESTAMP
})

然后您可以简单地以该优先级开始查询。

this._roomRef.startAt(Date.now()).on('child_added', ...

关于javascript - child_added 在删除后被触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25235283/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com