[英]How can I update data in a for loop when my data is returned with a defer after the loop completes
我有兩個數組:
$scope.grid.data and $scope.grid.backup
我使用以下腳本來一次比較每個元素中的數據:
for (var i = 0, len = $scope.grid.data.length; i < len; i++) {
if (!angular.equals($scope.grid.data[i], $scope.grid.backup[i])) {
var rowData = $scope.grid.data[i]
var idColumn = $scope.entityType.toLowerCase() + 'Id';
var entityId = rowData[idColumn];
entityService.putEntity($scope.entityType, entityId, $scope.grid.data[i])
.then(function (result) {
angular.copy(result, $scope.grid.data[i]);
angular.copy(result, $scope.grid.backup[i]);
}, function (result) {
alert("Error: " + result);
})
}
}
然后執行以下操作以更新數據庫:
putEntity: function (entityType, entityId, entity) {
var deferred = $q.defer();
EntityResource.putEntity({ entityType: entityType, entityId: entityId }, entity,
function (resp) {
deferred.resolve(resp);
}, function (resp) {
deferred.reject('Error updating');
});
return deferred.promise;
}
該腳本正確地注意到更改並更新數據庫。
但是,當putEntity返回結果並嘗試將結果復制到$ scope.grid.data [i]和$ scope.grid.backup [i]時,會出現問題。
這種情況稍后發生,並且在嘗試執行此操作時,總是嘗試將其放入元素11中。
有誰知道我如何確保從putEntity返回的數據被復制回grid.data和grid.backup數組的正確元素中?
您需要在i上創建一個閉包。 您可以做的就是創建一個函數
var updateGridData=function(entityType, entityId, gridDataToUpdate, gridIndex)
entityService.putEntity(entityType, entityId,gridDataToUpdate)
.then(function (result) {
angular.copy(result, $scope.grid.data[gridIndex]);
angular.copy(result, $scope.grid.backup[gridIndex]);
}, function (result) {
alert("Error: " + result);
})
}
所以你的主要方法變成
for (var i = 0, len = $scope.grid.data.length; i < len; i++) {
if (!angular.equals($scope.grid.data[i], $scope.grid.backup[i])) {
var rowData = $scope.grid.data[i]
var idColumn = $scope.entityType.toLowerCase() + 'Id';
var entityId = rowData[idColumn];
updateGridData($scope.entityType, entityId, $scope.grid.data[i],i);
}
}
您可以從這個問題中了解更多關於循環內JavaScript閉合的想法–簡單的實際示例
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.