AngularFire - 在$ asArray上管理child_added和其他事件

时间:2015-02-17 17:30:03

标签: angularjs firebase angularfire

大家好!

我想做一些非常简单的事情:在顶部显示最近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
    }
});

但是我无法弄清楚如何做我想做的事情,也没有在文档中找到它。谢谢你的帮助!

1 个答案:

答案 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将此数组与作用域上的主数据合并,以便显示新消息。

希望这有助于某人!