如何使用AngularFire对对象应用部分更新

时间:2014-09-25 09:50:12

标签: angularjs firebase angularfire

Angularfire 0.8中的$save()令我感到困惑。

这是一个最小的例子 - 来自我的controllers.js文件的片段:

    .controller('LandingPageController', ['$scope','$firebase', function($scope,$firebase) {
        $scope.addNode = function() {
            var FB = new Firebase('https://protodb.firebaseio.com/testrecords/');
            var fbr = $firebase(FB);
            fbr.$set(1,{firstname: 'James'});
        }
        $scope.addAttribute = function() {
            var FB = new Firebase('https://protodb.firebaseio.com/testrecords/1');
            var fbr = $firebase(FB).$asObject();
            fbr.lastname = "Bond";
            fbr.$save();
        }
        }])

当调用addNode()时,确实在我的firebase中创建了一个节点:

enter image description here

但是当调用addAttribute()时,整个记录被替换,而不是我所期望的,这是为了添加'lastname'属性。

enter image description here

我毫无疑问误解了这些文档。有人可以帮忙吗?

更新

好的,我需要等到对象加载完毕。将addAttribute更改为:

后,它现在可以使用了
    $scope.addAttribute = function() {
          var FB = new Firebase('https://protodb.firebaseio.com/testrecords/1');
          var fbr = $firebase(FB).$asObject();
          fbr.$loaded().then(function() {
              fbr.lastname = "Bond";
              fbr.$save();
          });
    }

1 个答案:

答案 0 :(得分:4)

你已经发现了自己:

  1. FirebaseObject(由$asObject()返回)没有$update方法。
  2. 在完全加载$save()之前致电FirebaseObject时,您最终可能会删除其他属性
  3. 要修补现有数据,您可以:

    1. 要么等待加载整个对象(就像你对问题的更新所做的那样)
    2. 或直接致电$firebase.$update
    3. $firebase(FB).$update({ lastname: "Bond" });
      

      最后一种方法的优点是,您不必下拉整个对象,只更新单个属性。请注意,在大多数情况下,这可能是premature optimization,但仍然......