我正在使用AngularJS和AngularFire。
我正在使用两个$ firebaseArrays,其中包含的对象基本上是彼此的替代版本。它们包含不同的数据,但会同时添加到数组中并从数组中删除,因为它们必须始终彼此对齐。出于这个原因,我需要使用相同的Firebase生成的唯一ID来保存它们。
保存的数组将复制到我的组件中,以便可以更改它们,从而可以选择将更改保存回原始数组,或者将其丢弃。
//The currently saved versions of the arrays.
var db = firebase.database().ref();
var mainArrayRef = db.child('mainArray');
var alternateArrayRef = db.child('alternateArray');
vm.originalMainArray = $firebaseArray(mainArrayRef);
vm.originalAlternateArray = $firebaseArray(alternateArrayRef);
//Copy the original arrays in order to make changes that can then be saved.
vm.activeMainArray = angular.copy(vm.originalMainArray);
vm.activeAlternateArray = angular.copy(vm.originalAlternateArray);
vm.activeMainArray.push( { value: x } );
vm.activeAlternateArray.push( { value: y } );
在向数组添加新项目时,我需要循环遍历activeMainArray,将数据保存到Firebase并将Firebase生成的唯一键附加到数组中的每个项目,以便在处理activeAlternateArray时,相应的可以使用相同的firebase生成唯一ID来保存对象。
function saveObjectsToFirebase(originalArray, activeArray, preprocessedArray){
//preprocessedArray is available during the processing of the alternateArray
var promises = [];
for(var i=0; i < activeArray.length; i++){
var newObject = angular.copy(activeArray[i]);
//If this is the main array, use standard methods to create unique id.
if(!preprocessedArray){
promises.push(originalArray.$add(newObject)
.then(function(firebaseObject){
//The newly created firebase id is attached to the object.
activeArray[i].id = firebaseObject.key
console.log(newObject.id)
})
}
//If this is the alternateArray (and the main array has been preprocessed and sent to this function)...
if(preprocessedArray){
//Get the firebase id from the corresponding object in the main array.
var id = preprocessedArray[i].id;
promises.push(originalArray.$ref().child(id).set(newObject))
}
return promises;
}
var mainArrayPromises = saveObjectsToFirebase(vm.originalMainArray, vm.activeMainArray);
$q.all(mainArrayPromises).then(function(){
var alternateArrayPromises = saveObjectsToFirebase(vm.originalAlternateArray, vm.activeAlternateArray, vm.activeMainArray);
$q.all(alternateArrayPromises).then(function(){
//The rest of the function
});
});
我需要做的就是确保在$ q.all(mainArrayPromises)运行时,将firebase密钥附加到主数组中的对象的.then()函数已经完成,因此密钥可用何时处理备用数组。我假设它将涉及$ q.when()或$ q.defer(),但我不确定如何在循环内生成的promise数组的结构中实现它。
奇怪的是,console.log输出将在处理第二个数组之前记录id,此时id实际上不可用并且将是未定义的。我不知道是这样的。
我希望这对你的时间有所帮助和感谢。