Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angularjs 保存新属性将覆盖firebase对象_Angularjs_Firebase - Fatal编程技术网

Angularjs 保存新属性将覆盖firebase对象

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

我正在使用firebase和angular进行测验。在测验结束时,我想使用以下代码将新属性保存到users对象:

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
    参数,调用
    $save()
    将有效地删除Firebase ref中所有其他预先存在的子对象
在修改和/或更新对象之前,您可以使用等待对象完全下载来避免这种情况

编辑:但是,正如指南所述

使用该方法时应小心,因为它仅在初始加载后调用一次。除了调试之外,使用它做任何事情通常都是一种糟糕的做法

如果忽略此警告并无论如何使用
$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方法在角度环境中更直接(纠正我的错误)。但是弗兰克说的“你可能做错了什么”让我现在这样做很害怕。。。