0

私は2つの配列を持っています:

$scope.grid.data and $scope.grid.backup

次のスクリプトを使用して、一度に 1 つの要素のデータを比較します。

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);
    }
}

この質問からさらにアイデアを得ることができますループ内の JavaScript クロージャー – 簡単な実用例

于 2013-07-24T14:06:20.963 に答える