当前,如果需要更新$ 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 }
&我们执行上面的代码,它将完整的更新对象推到Firebase上,即
{ name: 'New Rahul', age: 23 }
虽然您可能希望它像这样推动它:
{ name: 'New Rahul' }
起初,这似乎还可以,因为数据库中的所有内容都将按预期显示。
问题在Firebase规则进入图片时到达。
假设age
只是一个只读密钥,而name
是允许客户端更新的内容。
现在,当获得$ firebaseObject(ref)时,它将获得所有键(名称和年龄),但是当我们尝试仅更改name
并调用$save()
时,firebase将会之所以说Permission Denied
,是因为它也在尝试使用包含只读属性.set()
的完整对象来age
。
我想知道如何使用$ firebaseObject而不是整个对象来仅更新一组键。
在内部,angularfire代码调用firebase的ref.set()
方法,该方法将整个对象推送到firebase:
https://github.com/firebase/angularfire/blob/master/src/database/FirebaseObject.js#L95
另外,我认为也许我们可以使用$ extend来实现它,但无法弄清楚。因此,感谢您的帮助。