/ / $ firebaseObject. $ save () sobrescreve o nó inteiro - firebase, angularfire

$ firebaseObject. $ save () sobrescreve o nó inteiro - firebase, angularfire

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 № 1

O 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.