复制一个 $firebaseObject 并将其保存到不同的位置
Copy a $firebaseObject and save it to a different location
在我的应用程序中,我使用 $firebaseObject 从我的 firebase 获取一个对象。使用此对象有两个选项,更改它并保存对象中的更改或更改它并将其另存为新版本。
我的问题是让第二个选项起作用。首先,我可以简单地使用 $save() 并且它完美地工作,但到目前为止我还无法制作对象的副本并将其保存在我的 firebase 中的不同位置。
到目前为止我已经尝试过:
- 将实际对象保存在不同位置(错误:Firebase.push 失败:第一个参数在 属性 中包含无效键($$conf))
- 使用 angular.copy($firebaseObject) 复制对象(错误:'length' getter 调用了未实现接口存储的对象。)
- 使用 $firebaseObject 的 $value(给出未定义,因为我的对象不是原始对象,请参阅 $value documentation)
- 在 javascript 中创建一个单独的对象并手动复制 $firebaseObject
中的所有值
前 3 个选项失败(错误代码与选项一起显示),最后一个选项有效但不是真正的选项,因为对象可以有不同的字段。
有人知道这个问题的解决方案吗?
您可以使用 $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;
}
并使用 getObject(FBObj1) 插入 FBObj1.$value
非常有用的答案。添加我自己的解决方案,这只是 Frane 的扩展并使用 Angularfire 2.3:
最终结果:
- 将第一个对象绑定到 DOM 保存第一个对象时,保存相同的对象
使用相同密钥的另一个节点以允许将来
cross-reference理论上,如果需要也可以插入字段
在保存到节点 #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;
}
在我的应用程序中,我使用 $firebaseObject 从我的 firebase 获取一个对象。使用此对象有两个选项,更改它并保存对象中的更改或更改它并将其另存为新版本。
我的问题是让第二个选项起作用。首先,我可以简单地使用 $save() 并且它完美地工作,但到目前为止我还无法制作对象的副本并将其保存在我的 firebase 中的不同位置。
到目前为止我已经尝试过:
- 将实际对象保存在不同位置(错误:Firebase.push 失败:第一个参数在 属性 中包含无效键($$conf))
- 使用 angular.copy($firebaseObject) 复制对象(错误:'length' getter 调用了未实现接口存储的对象。)
- 使用 $firebaseObject 的 $value(给出未定义,因为我的对象不是原始对象,请参阅 $value documentation)
- 在 javascript 中创建一个单独的对象并手动复制 $firebaseObject 中的所有值
前 3 个选项失败(错误代码与选项一起显示),最后一个选项有效但不是真正的选项,因为对象可以有不同的字段。
有人知道这个问题的解决方案吗?
您可以使用 $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;
}
并使用 getObject(FBObj1) 插入 FBObj1.$value
非常有用的答案。添加我自己的解决方案,这只是 Frane 的扩展并使用 Angularfire 2.3:
最终结果:
- 将第一个对象绑定到 DOM 保存第一个对象时,保存相同的对象 使用相同密钥的另一个节点以允许将来 cross-reference理论上,如果需要也可以插入字段 在保存到节点 #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;
}