2014-09-25 42 views
3

Angularfire 0.8中的$save()令我困惑。如何使用AngularFire对对象进行部分更新

这里有一个小例子 - 从我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()叫,果然,在我的火力点创造了一个节点:

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(); 
      }); 
    } 

回答

4

当你发现自己已经:

  1. 一个FirebaseObject(由$asObject()返回)不具有$update方法。
  2. 当你在一个FirebaseObject$save()完全加载之前,你可能最终删除其他性质

要修补现有的数据,您可以:

  1. 要么等待整个目标是加载(如你在更新的问题所做的那样)
  2. 或致电$firebase.$update直接
$firebase(FB).$update({ lastname: "Bond" }); 

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

+0

这不起作用恐怕 - fbr是$ FirebaseObject,它没有$ update方法 - https://www.firebase .com/docs/web/libraries/angular/api.html#firebaseobject – ropz 2014-09-25 13:08:56

+0

对不起,我以为你有一个数组。 'FirebaseObject'确实没有更新方法,所以你必须采取另一种方法。我更新了我的答案。 – 2014-09-25 13:24:40

+0

谢谢。我现在明白了。有趣的是,文档:https://www.firebase.com/docs/web/libraries/angular/guide.html明确建议你可以在对象级别做到这一点。请参阅“保存同步对象...然后,我们可以使用$ save()方法更新对象并将其保存回firebase。” – ropz 2014-09-25 13:33:57