0

我有两个数组:

$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 数组的正确元素?

4

1 回答 1

1

您需要在 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);
    }
}

你可以从这个问题中得到更多的想法JavaScriptclosure inside loops – 简单的实际示例

于 2013-07-24T14:06:20.963 回答