Angularjs 保存新属性将覆盖firebase对象
我正在使用firebase和angular进行测验。在测验结束时,我想使用以下代码将新属性保存到users对象:Angularjs 保存新属性将覆盖firebase对象,angularjs,firebase,Angularjs,Firebase,我正在使用firebase和angular进行测验。在测验结束时,我想使用以下代码将新属性保存到users对象: function saveTopscore() { var ref = new Firebase(CONSTANTS.FIREBASE_URL + 'users/' + User.user.$id + '/'); var userObject = $firebaseObject(ref); userObject.topscore = User.totalCor
function saveTopscore() {
var ref = new Firebase(CONSTANTS.FIREBASE_URL + 'users/' + User.user.$id + '/');
var userObject = $firebaseObject(ref);
userObject.topscore = User.totalCorrect;
userObject.$save().then(function(ref) {
console.log("worked");
}, function(error) {
console.log(error);
});
}
它可以工作,但也会覆盖用户对象的所有属性。因此,该对象通常包含名称、用户名、电子邮件、密码等,但当我按下topscore时,它将成为该对象的唯一属性。为什么?为什么在这里使用
$firebaseObject
?只有将其三向绑定到角度视图时,该选项才有用。如果您使用的是常规JavaScript代码,只需使用Firebase的常规JavaScript SDK即可
在这种情况下,只需执行以下操作:
ref.update({ topscore: User.totalCorrect });
正如@Frank所说,使用JavaScript SDK 我想澄清原始上下文(使用
$firebaseObject
),以防将来有人提到这个问题
- 发生最初的症状是因为您正在设置对象的单个参数,并在对象(及其现有子对象)完全下载之前将其保存李>
- 因此,在调用
时,$save()
将(很可能)只设置其userObject
参数,调用topscore
将有效地删除Firebase ref中所有其他预先存在的子对象$save()
$loaded()
,则该实现可能如下所示:
注意-反模式:这不是推荐的做法。
var ref=newfirebase(fbUrl+'/users/'+User.User.$id+'/');
var userObject=$firebaseObject(ref);
//等待userObject下载完毕,然后修改并保存它。
userObject.$loaded().then(函数()){
userObject.topscore=User.totalCorrect;
userObject.$save().then(函数(ref){
控制台日志(“已保存”);
},函数(错误){
console.log(错误);
});
});
正如弗兰克在对这个答案的评论中所说
“如果您直接在$firebaseObject
(或$firebaseArray
)之后使用$loaded()
,可能是做错了什么。”
谢谢你,真管用!我这样做是因为api文档中有这样的描述。但这要容易得多。我敢肯定,如果您不打算在视图或服务中同步数据,API文档不会说使用$bindTo或任何AngularFire绑定。(提示:我写的)嗨,西南。你的方法也有效。但我已经开始使用一条规则:“如果您直接在
$firebaseObject
(或$firebaseArray
)之后使用$loaded()
,您可能做错了什么”。我们看到,$loaded()
的使用太多了,我将向大家展示为什么人们不需要它还是。。。你的解决方案也很有效。嗨,弗兰克。这是一个伟大的观点,这是一个伟大的规则!谢谢你的澄清。我希望解释一下数据下载的过程。我现在看到,使用$loaded()
进行调试以外的操作被认为是一种糟糕的做法。如果$loaded()
被过度使用,有什么解决方案吗?我认为有一个功能性反模式列表作为参考是非常棒的。你找到的新文档是我们试图更明确的一种方式。但这仍然很棘手。我们经常告诉人们只需将$firebaseObject
绑定到视图中的元素。它将用更少的代码完成他们试图做的事情(调试/检索到的数据),这就是AngularFire的全部内容。很棒的讨论和想法。Sinan,如果您遇到任何您认为可能是良好用法或反模式的内容,请将其发送电子邮件,我们将添加到文档中。@Sinanbollel我想为什么人们一直犯上述错误,可能会选择$loaded而不是简单地使用SDK更新,因为SDK更新没有返回承诺。。。但是firebaseObject会。所以,在服务中使用它,我们不需要费劲地创建$q并将承诺返回控制器。因此,我认为$loaded方法在角度环境中更直接(纠正我的错误)。但是弗兰克说的“你可能做错了什么”让我现在这样做很害怕。。。