$ firebaseObject。$ save()覆盖整个节点

时间:2015-08-01 18:45:29

标签: firebase angularfire

我有一个plunker,我有一个简单的更新 - 更新记录的方法。但是当我向记录添加或更新属性时,整个记录将被覆盖。

数据

{
  "org1" : {
    "description" : "too lazy",
    "name" : "Apple",
    "website" : "http://www.apple.com"
  },
  "org2" : {
    "name" : "Google",
    "test1" : "test123",
    "website" : "http://www.google.com"
  }
}

更新()

this.update = function() {
  //var obj = new Organization('org2');
  var obj = $firebaseObject(new Firebase('https://thefactorymess.firebaseio-demo.com/organizations/org2'));
  obj.test1 = 'test123';
  obj.$save().then(function() {
    console.log('org new', obj);
  });
};

这是plunker

有人能解释一下这种行为吗?

1 个答案:

答案 0 :(得分:4)

AngularFire $save()方法确实会覆盖该位置的当前数据。它是通过调用Firebase的JavaScript SDK set()方法实现的,该方法就是这样做的。

由于您在创建参考后立即致电$save(),因此尚未从Firebase服务器加载数据。因此,您要创建具有单个属性test1的对象。当你然后$save()该对象到服务器时,你最终得到一个具有单个属性的对象。

如果您只想更新某些属性,可以拨打update()

var ref = new Firebase('https://thefactorymess.firebaseio-demo.com/organizations/org2');

ref.update({ test1: 'test123' });

这不使用AngularFire。但是,由于AngularFire是基于常规Firebase JavaScript SDK构建的,因此它们可以毫无问题地进行互操作。

或者,您可以使用AngularFire的$loaded()承诺等待对象完全加载。但这会导致更多代码和数据下拉。

我的经验法则是:

  

仅使用AngularFire将内容绑定到$scope。对于其他所有内容,请使用Firebase JavaScript SDK。