Firebase JavaScript / AngularFire - 如何获取被监视对象的最后添加属性?

时间:2017-01-01 23:07:10

标签: firebase firebase-realtime-database angularfire

我有一个Firebase对象,如下所示:

-notifications
    -1-1-2017 1:08:22 PM
        -message: 'test'
        -timestamp: 1483294112
    -1-1-2017 1:08:23 PM
        -message: 'two'
        -timestamp: 1483294113
    -1-1-2017 2:08:22 PM
        -message: 'three'
        -timestamp: 1483294473

我不断将新属性推送到密钥为日期时间的notifications对象中。

如果我的notifications如下所示,如何获取附加到$watch对象的最新属性?

var ref = new Firebase(firebaseConstants.url + 'notifications');
var sync = $firebase(ref);
$scope.notifications = sync.$asArray();
$scope.$watch('notifications', function(){
    ......
});

我想避免在$scope.notifications上运行循环来查找旧值和新值之间的差异。

使用Firebase JS API或AngularFire库是否有内置方法可以执行此操作?

1 个答案:

答案 0 :(得分:0)

好吧,好像你正在使用一个过时的angularfire版本。我的答案将基于最新版本(2.2.0)。但是,根据这个答案,我将在1.0.0以后提供我将使用的所有功能:https://stackoverflow.com/a/28896261/6162666

由于您要求使用内置方式执行此操作,因此我不会尝试仅根据$ scope提供答案。$ watch。 Angularfire对象和数组已经支持了$ watch方法很长一段时间了。您只需在$ firebaseArray上调用$ watch,它就会告诉您新事件发生的时间。

请注意$ watch在$ firebaseArray / $ firebaseObject上调用,而不在$ scope上调用。

说完所有这些,如果你将代码转换为最新版本的angularfire,它看起来像这样:

var ref = new Firebase(firebaseConstants.url + 'notifications');
var notifications = $firebaseArray(ref);
notifications.$watch(function(events){
   console.log(events); //Logs all the child_added events when new notifications are pushed
});

相比之下,docs中给出的示例如下:

var list = $firebaseArray(ref);

list.$watch(function(event) {
  console.log(event);
});

list.$remove("foo");
// logs { event: "child_removed", key: "foo" }

list.$add({ hello: "world" });
// logs { event: "child_added", key: "<new_id>", prevId: "<prev_id>" }

稍后,您可以调用$ destroy()来停止侦听更改。

我应该指出,这只会在添加时显示新的ID,这似乎正是您所需要的。