【问题标题】:Copy a $firebaseObject and save it to a different location复制 $firebaseObject 并将其保存到其他位置
【发布时间】:2016-02-19 15:00:09
【问题描述】:

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

我的问题是让第二个选项起作用。首先,我可以简单地使用 $save() 并且它工作得很好,但到目前为止我还无法制作对象的副本并将其保存在我的 firebase 的不同位置。

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

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

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

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

【问题讨论】:

    标签: angularjs firebase angularfire


    【解决方案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.$value 的 getObject(FBObj1) insetad

    【讨论】:

    • 不幸的是,这仅适用于 $firebaseObject 是原始类型(布尔值、字符串或数字)的情况。我的对象有多个字段,然后 $value 返回 undefined 。我将更新我的问题以包含此信息。
    • 完美,我实际上是在反过来想,取我需要的字段而不是删除我不需要的字段:)
    【解决方案2】:

    非常有用的答案。添加我自己的解决方案,这只是对 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;
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      • 2016-05-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多