$firebaseObject.$save() 覆盖整个节点
$firebaseObject.$save() overwrites the whole node
我有一个 plunker,我有一个简单的更新方法来更新 recorcd。但是当我添加或更新一个属性到记录时,整个记录将被覆盖。
数据
{
"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.
谁能给我解释一下这种行为?
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()
承诺来等待对象完全加载。但这会导致更多的代码和下拉数据。
我的经验法则是:
Only use AngularFire for binding things to the $scope
. For everything else, use the Firebase JavaScript SDK.
我有一个 plunker,我有一个简单的更新方法来更新 recorcd。但是当我添加或更新一个属性到记录时,整个记录将被覆盖。
数据
{
"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.
谁能给我解释一下这种行为?
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()
承诺来等待对象完全加载。但这会导致更多的代码和下拉数据。
我的经验法则是:
Only use AngularFire for binding things to the
$scope
. For everything else, use the Firebase JavaScript SDK.