Eu tenho um plunker onde eu tenho um método de atualização simples para atualizar um recorcd. Mas quando eu adiciono ou atualizo uma propriedade ao registro, todo o registro será sobrescrito.
Os dados
{
"org1" : {
"description" : "too lazy",
"name" : "Apple",
"website" : "http://www.apple.com"
},
"org2" : {
"name" : "Google",
"test1" : "test123",
"website" : "http://www.google.com"
}
}
atualizar()
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);
});
};
Aqui está o plunker.
Alguém pode me explicar esse comportamento?
Respostas:
4 para resposta № 1O AngularFire $save()
O método realmente sobrescreve os dados atuais naquele local. É implementado chamando o set()
método do JavaScript SDK do Firebase, que faz exatamente isso.
Desde que você está chamando $save()
imediatamente após a criação da referência, os dados ainda não foram carregados dos servidores do Firebase. Então você está criando um objeto com uma única propriedade test1
. Quando você então $save()
esse objeto para o servidor, você acaba com um objeto com uma única propriedade lá também.
Se você quiser apenas atualizar algumas propriedades, pode ligar update()
.
var ref = new Firebase("https://thefactorymess.firebaseio-demo.com/organizations/org2");
ref.update({ test1: "test123" });
Isso não usa AngularFire, mas como o AngularFire é construído sobre o Firebase JavaScript SDK regular, eles interoperam sem problemas.
Alternativamente, você pode usar o AngularFire $loaded()
prometo esperar que o objeto tenha carregado completamente. Mas isso levaria tanto a mais código quanto a dados.
Minha regra de ouro é:
Use o AngularFire apenas para vincular as coisas ao
$scope
. Para todo o resto, use o Firebase JavaScript SDK.