复制$ firebaseObject并将其保存到其他位置

时间:2016-02-19 15:00:09

标签: angularjs firebase angularfire

在我的应用程序中,我使用$ firebaseObject从我的firebase获取一个对象。该对象有两个选项,更改它并保存对象中的更改或更改它并将其另存为新版本。

我的问题是让第二个选项起作用。对于第一个我可以简单地使用$ save()并且它完美地运行但是到目前为止我还没有能够制作对象的副本并将其保存在我的firebase中的不同位置。

到目前为止,我已尝试过:

  • 将实际对象保存在其他位置(错误:Firebase.push失败:第一个参数在属性中包含无效密钥($$ conf))
  • 使用angular.copy($ firebaseObject)制作对象的副本(错误:'长度'在未实现接口存储的对象上调用getter。)
  • 使用$ firebaseObject的$ value(因为我的对象不是原语而给出未定义的,请参阅$value documentation
  • 在javascript中创建单独的对象并手动复制$ firebaseObject
  • 中的所有值

前3个选项失败(错误代码与选项一起显示),最后一个选项有效,但实际上不是一个选项,因为该对象可以有不同的字段。

有没有人知道这个问题的解决方案?

2 个答案:

答案 0 :(得分:1)

您可以使用$ firebaseObject的$ value字段。

例如:

var ref = new Firebase("https://<YOUR-FIREBASE-APP>.firebaseio.com");
var FBObj1 = $firebaseObject(ref.child('child'));
ref.child('newChild').set(FBObj1.$value);

编辑:

由于这只适用于基元,你可以尝试这样的事情:

function getObject(obj) {
    var newObj = {};
    for (var key in obj) {
       if (key.indexOf('$') < 0 && obj.hasOwnProperty(key)) {
          newObj[key] = obj[key];
       };
    }
    return newObj;
}

并使用FBObj1的getObject(FBObj1)insetad。$ value

答案 1 :(得分:0)

难以置信的有用答案。添加我自己的解决方案,这只是对Frane的扩展并使用Angularfire 2.3:

最终结果:

  • 将第一个对象绑定到DOM保存第一个对象时,保存相同的对象 使用相同的密钥到另一个节点以允许将来 交叉引用理论上,您还可以根据需要插入字段 在保存到节点#2之前

html:

<a href="#" editable-text="data.field1" onaftersave="saveData()">
{{ data.field1 || "empty"  }}
</a>

<a href="#" editable-text="data.field2" onaftersave="saveData()">
{{ data.field2 || "empty"  }}
</a>

在控制器中:

var ref = firebase.database().ref().child(entries);
var obj = $firebaseObject(ref);
obj.$bindTo($scope, "data");


function saveData(){
    $scope.data.$save().then(function() {
        var newObject = getObject($scope.data);
        // In theory, add other field here
        var ref2 = firebase.database().ref().child(otherNode).child($scope.data.$id);
        ref2.update(newObject);
    }).catch(function(error) {
        console.log('Error ' + error.message);
    });
}

function getObject(obj) {
    var newObj = {};
    for (var key in obj) {
        if (key.indexOf('$') < 0 && obj.hasOwnProperty(key)) {
            newObj[key] = obj[key];
        };
    }
    return newObj;
}