当$ firebaseArray或$ firebaseObject返回空时,确保绑定$ watch

时间:2015-09-14 01:45:47

标签: javascript angularjs firebase angularfire

我正在使用Angularfire,而$firebaseArray$firebaseObject首先没有返回任何内容。这是因为它已经空了或者还没有。但是我想要一直监视那个对象/数组。稍后再说,节点实际存在。原始$firebaseArray$firebaseObject不会触发$ watch事件。

即使节点为空/最初不存在,如何确保$ watch的绑定?当我创建新用户并且某个节点中没有任何内容时,会发生这种情况。

更新1

http://plnkr.co/edit/tQur74nkRIE9ZOiJUAgf?p=preview

JS

var app = angular.module('plunker', ['firebase']);
var Ref = new Firebase('https://so32556276.firebaseio.com');

app.controller('MainCtrl', function($scope, $firebaseObject) {
  $scope.data = $firebaseObject(Ref.child('user'));

  $scope.data.$loaded().then(function(res) {
    $scope.data.$watch(function(e) {
      console.log('Something changed');
      console.log(e);
    });
  });

  $scope.changeName = function() {
    $scope.data.name = "test2";
    $scope.data.$save();
  }

  $scope.changeAge = function() {
    $scope.data.age = "10";
  }
});

HTML

  <body ng-controller="MainCtrl">
    <p>Hello {{data.name}}!</p>
    <p>Your age is {{data.age}}!</p>
    <a href="" ng-click="changeName()">Change Name</a><br>
    <a href="" ng-click="changeAge()">Change Age</a>
  </body>

火力地堡

enter image description here

如果我点击&#34;更改名称&#34;,您可以在此处看到日志事件:

Something changed
app.js:10 Object {event: "value", key: "user"}

如果我点击&#34;更改年龄&#34;,虽然前端可以检测到变量,但$watch无法看到此变量。在控制台中没有任何东西。

有任何线索如何避免这种情况?

1 个答案:

答案 0 :(得分:1)

在大多数情况下,当我看到有人试图使用$loaded()时,他们仍然陷入“首先加载数据,然后做......”的心态。 Firebase(以及AngularFire)是“同步这些数据,无论何时它发生变化......”系统。你使用$watch()绝对是正确的方法,你只是在错误的时刻附上它。

app.controller('MainCtrl', function($scope, $firebaseObject) {
  $scope.data = $firebaseObject(Ref.child('user'));

  $scope.data.$loaded().then(function(res) {
    $scope.data.$watch(function(e) {
      console.log('Something changed');
      console.log(e);
    });
  });

从Firebase加载初始数据后,$loaded()承诺即可完成;或者一个Firebase确定还没有数据。您只能在加载初始数据后注册$watch()处理程序,因此只会在此之后触发更改。

解决方案是立即将$watch()处理程序附加到$firebaseObject

app.controller('MainCtrl', function($scope, $firebaseObject) {
  $scope.data = $firebaseObject(Ref.child('user'));
  $scope.data.$watch(function(e) {
    console.log('Something changed');
    console.log(e);
  });