Проблема
В настоящее время, если нам нужно обновить пару ключ-значение в ссылке $ firebaseObject, angularfire предлагает использовать метод $ save () примерно так:
var obj = $firebaseObject(ref);
// Changing just the name
obj.name = "New Rahul";
obj.$save().then(function(ref) {
ref.key === obj.$id; // true
}, function(error) {
console.log("Error:", error);
});
Ссылка: https://github.com/firebase/angularfire/blob/master/docs/reference.md#save
Итак, предположим, что объект в базе данных firebase:
{ name: 'Rahul', age: 23 }
И мы выполним приведенный выше код, он переместит полностью обновленный объект в базу данных, т.е.
{ name: 'New Rahul', age: 23 }
в то время как вы можете ожидать, что он будет просто толкать его так:
{ name: 'New Rahul' }
Сначала это выглядит нормально, так как в базе данных все будет выглядеть так, как ожидалось.
Проблема появляется, когда на картинке появляются правила пожарной базы.Допустим, age
был просто ключом только для чтения, а name
разрешено обновлять клиентам.
Теперь, когда $ firebaseObject (ref) получен, он получит все ключи.(имя и возраст), но когда мы пытаемся изменить только name
и вызвать $save()
, firebase скажет Permission Denied
, поскольку он также пытается .set()
с полным объектом, который включает в себя свойство только для чтения age
.
Мой вопрос?
Я хочу знать, как я могу добиться обновления только определенного набора ключей с помощью $ firebaseObject, а не полного объекта.
Мои наблюдения
Внутренне код angularfire вызывает метод firebase ref.set()
, который помещает весь объект в базу огня:
https://github.com/firebase/angularfire/blob/master/src/database/FirebaseObject.js#L95
https://github.com/firebase/angularfire/blob/b6dca6ea5a81b3edd44230fb1cb6ca62419f1926/src/utils/utils.js#L332
ТакжеЯ думаю, что, может быть, мы можем использовать $ extended для достижения этой цели, но не в состоянии это выяснить.Так что оцените любую помощь.