如何使用$ firebaseObject更新对象的特定键?

时间:2018-12-11 09:10:08

标签: angularjs firebase firebase-realtime-database angularfire

问题

当前,如果需要更新$ 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

https://github.com/firebase/angularfire/blob/b6dca6ea5a81b3edd44230fb1cb6ca62419f1926/src/utils/utils.js#L332

另外,我认为也许我们可以使用$ extend来实现它,但无法弄清楚。因此,感谢您的帮助。

0 个答案:

没有答案