选择Firebase数组的子集时不调用ref.on(…)

选择Firebase数组的子集时不调用ref.on(…),firebase,angularfire,Firebase,Angularfire,我有两个数组,$scope.messages和$scope.aggregatedMessages$scope.messages绑定到Firebase阵列。$scope.messages有一个日期属性,用于仅显示某个日期的消息。很简单。添加新消息或用户更改日期时,我希望重新加载aggregatedMessages数组 $scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(date)); 。。。用于将$scope.mes

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

$scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(date));
。。。用于将$scope.messages数组与Firebase绑定。选择新日期时,将再次调用上述函数

。。。用于在发生更改时重建aggregatedMessages数组,我知道应该使用child_added等。。。稍后我会告诉你:

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


对于这种情况,最佳做法是什么?

最佳做法是不重建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));

您能提供触发on值回调的代码吗?另外,当使用AngularFire时,您通常不需要在回调上写入数据,因为AF会自动处理同步。我知道。但是aggregatedMessages数组不是Firebase数组。由于无法在Firebase中直接聚合数据,因此我需要一种方法来构建一个新的数组aggregatedMessages,例如在侧边栏中显示主题和消息数。通过迭代存储在Firebase中的消息并重建非Firebase aggregatedMessages数组可以更好地做到这一点。好吧,这是个坏名字:所以我希望能够侦听消息数组上的更改,即使当我使用ref.orderByChilddate.equalTonewDate选择数组时,我只处理数组的子集。。。您希望能够在数组和聚合数组上进行迭代吗?是的。但我想了解的是Firebase是否有一个ref指向我的消息列表。然后我想获得消息列表子集的另一个引用。例如,ref->{12,20,43,67,98}。现在我需要一个新的ref,substref=ref.startAt20.endAt67,它给了我:sunsetRef={20,43,67}。如果我开始监听ref和substref上的更改,例如$firebaseArrayref.$add25是否也会触发substref。。。新值为25的函数?
$scope.messages.$destroy()
$scope.messages = $firebaseArray(ref.orderByChild("date").equalTo(aNewDate));