大家好!
我想做一些非常简单的事情:在顶部显示最近10个帖子,当有人发布新帖子时,显示一个栏"点击此处查看x个新帖子"单击时显示新的。
我的问题:当新帖子进入Firebase时,它会立即显示在屏幕上(使用与Firebase中阵列相关联的范围数组上的ng-repeat),并取出10个元素中较旧的元素。
$firebase(ref.limitToLast(10)).$asArray().$loaded().then(function(messagesData) { ... }
我可以使用
检测更改messagesData.$watch(function(data) {
console.log("data changed!", data, messagesData);
if(data.event == "child_added") {
// work here
}
});
但是我无法弄清楚如何做我想做的事情,也没有在文档中找到它。谢谢你的帮助!
答案 0 :(得分:2)
好的,有一个解决方案。在仍然享受当前元素使用AngularFire的同时,可能无法使所有内容保持同步。这是如何。
首先获取您想要在开头显示的消息:
$firebase(ref.orderByKey().limitToLast(nbMessages)).$asArray().$loaded().then(function(messagesData) { ......
然后使用foreach将它们逐个链接到另一个数组:
angular.forEach(messagesData, function(value, key) {
messagesDataReturn[key] = value;
// get any other data you need for that message (user name, etc...
});
这将使每个元素迭代同步。因此,如果有像喜欢的计数器,它们将被实时更新。
最后添加一个观察者:
messagesData.$watch(function(data) {
if(data.event == "child_added") {
var newLine = messagesData.filter(function ( obj ) {
return obj.$id === data.key;
})[0];
// add any needed data for this new line
$rootScope.$broadcast('list:updated', newLine);
}
});
在您的控制器中,您只需要收听广播:
$scope.newData = [];
$scope.$on('list:updated', function (event, data) {
$scope.newData.push(data);
});
然后,您可以使用$ scope.newData显示显示新消息的方式,并且onclick将此数组与作用域上的主数据合并,以便显示新消息。
希望这有助于某人!