【问题标题】:ref.on(...) isn't called when selecting a subset of a Firebase array选择 Firebase 数组的子集时不调用 ref.on(...)
【发布时间】:2015-09-03 09:37:19
【问题描述】:

我有两个数组,$scope.messages 和 $scope.aggregatedMessages。 $scope.messages 绑定到 Firebase 数组。 $scope.messages 有一个 date 属性,用于仅显示某个日期的消息。非常简单。当添加新消息或用户更改日期时,我希望重新加载聚合消息数组。

$scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(date));

... 用于将 $scope.messages 数组与 Firebase 绑定。选择新日期时,会再次调用上述函数。

ref.on("value", function(value) {
...
});

... 用于在发生变化时重建聚合消息数组(我知道,应该使用 child_added 等代替...我稍后会:)。

现在,这不起作用,因为当将新项目添加到 $scope.messages 时,Firebase 不会调用我的回调函数(在 ref.on 中),但是 $scope.messages.$add(... ) 做它应该做的工作。

这种情况的最佳做法是什么?

【问题讨论】:

  • 能否提供触发 on value 回调的代码?此外,当使用 AngularFire 时,您通常不需要编写 on 回调,因为 AF 会自动处理同步。

标签: firebase angularfire


【解决方案1】:

最佳做法是不要重建您的 firebaseArray,如果将数据添加到 firebase ref,它们将自动同步。

$scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(date));

$scope.messages.$ref().on('child_added', function(snap){
  console.log(snap.key(), snap.val());
})

ref.push(data)
// > console will log the new data key and value if data.date == date

如果你必须重建一个firebaseArray,不要忘记在删除它之前调用$destroy,告诉firebase不要再听ref并清除内存

$scope.messages.$destroy()
$scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(aNewDate));

【讨论】:

  • 我知道。但聚合消息数组不是 Firebase 数组。由于无法直接在 Firebase 中聚合数据,因此我需要一种构建新数组(aggregatedMessages)的方法,例如在侧边栏中显示主题和消息数量。这最好通过遍历存储在 Firebase 中的消息并重建非 Firebase 聚合消息数组来完成(好吧,虽然这是一个坏名字:) 所以我希望能够监听消息数组的变化,即使我在仅处理数组的一个子集(当我使用 ref.orderByChild("date").equalTo(newDate) 选择一个数组时)
  • ...并且您希望能够遍历您的数组和聚合的数组?
  • 是的。但是我想用 Firebase 理解的是,如果我有一个指向我的消息列表的 ref。然后我想获得消息列表子集的另一个引用。例如,ref -> { 12, 20, 43, 67, 98 }。现在我想要一个新的参考,subsetRef = ref.startAt(20).endAt(67),它给了我:sunsetRef = { 20, 43, 67 }。如果我开始监听 ref 和 subsetRef 上的更改,是否会有更改,例如$firebaseArray(ref).$add(25) 也触发了新值 25 的 subsetRef.on(...) 函数?
猜你喜欢
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-07
相关资源
最近更新 更多