2014-02-05 52 views
6

我在過去的一天掙扎着一些奇怪的情況。 發生什麼事情是,對遠程服務器上的API的http請求偶爾會發送重複的請求。 任何人都可以提供關於如何避免這些重複請求的幫助嗎?AngularJS如何防止重複的http請求?

這裏是我在工廠使用一個函數的一個例子:

factory.getAllConsultedClientsLogs = function(oParams) { 

    var deferred = $q.defer(); 

    $http.post('url/to/api', oParams) 
     .success(function(response) { 
      deferred.resolve(response); 
     }) 
     .error(function() { 
      deferred.reject("Error! @factory.getAllConsultedClientsLogs"); 
     }); 

return deferred.promise; 

}; 

...和控制器上指示使用上述的函數的一個例子:

$scope.openConsultedClientsLogsModal = function(operator, date) { 

    if (angular.isDefined(operator) && angular.isDefined(date)) { 

     RrAuditingFactory.getAllConsultedClientsLogs({'operator':operator,'date':date}).then(function(promise) { 

      if (angular.isObject(promise) && angular.isDefined(promise.error) && promise.error == 0) { 

       var modalInstance = $modal.open({ 
        templateUrl: 'path/partial', 
        controller: function($scope, $modalInstance, logsResult) { 
         $scope.logsResult = logsResult; 
        }, 
        resolve: { 
         logsResult: function() { 
          return promise.result; 
         } 
        } 
       }); 

       modalInstance.result.then(function() { 
       }, function() { 
       }); 

      } else { 
       ErrorContext.setError(promise.errorMsg); 
      } 

     }, function(promise) { 
      ErrorContext.setError(promise); 
     }); 

    } else { 

     ErrorContext.setError(); 

    } 

}; 

謝謝你提前..希望任何人都可以幫助我...

回答

1

我看到你的鏈接:

$scope.fnRowCallback = function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 

     $('td:eq(4)', nRow).bind('click', function() { 
      $scope.$apply(function() { 
       $scope.openConsultedClientsLogsModal(aData.Operator, aData.LogDate); 
      }); 
     }); 

     return nRow; 
    }; 

你可以做綁定之前解除綁定,這樣你就避免重複。 嘗試這樣的:

$scope.fnRowCallback = function(nRow, aData, iDisplayIndex, iDisplayIndexFull) { 



     //add this unbind to your code 
     $('td:eq(4)', nRow).unbind("click"); 


     $('td:eq(4)', nRow).bind('click', function() { 
      $scope.$apply(function() { 
       $scope.openConsultedClientsLogsModal(aData.Operator, aData.LogDate); 
      }); 
     }); 

     return nRow; 
    }; 

我希望這有助於。

+0

有意義...我測試瞭解綁定並解決了我的問題。謝謝您的合作。 – edgaraafelix

0

我傾向於從工廠返回一個對象,所以在你的情況下,我會這樣做:

module.factory('clientsLogs', function($q, $http) { 

    return { 
    getAllConsulted: function(oParams) { 
     var deferred = $q.defer(); 
     $http.post('url/to/api', oParams) 
     .then(function(response) { 
      deferred.resolve(response); 
     }, function() { 
      deferred.reject("Error! @factory.getAllConsultedClientsLogs"); 
     }); 

     return deferred.promise; 
    } 
    } 

}); 

,然後在你的控制器是這樣的:

module.controller('MyCtrl', function($scope, clientsLogs) { 
    clientLogs.getAllConsulted({}).then(function(){...}) 
} 

也許不能幫助你,但我從來沒有與重複調用做這種方式的任何問題。

+1

謝謝你的回覆。但我這樣做......事情是,在某些情況下,它會重複呼叫。所以,我想知道是否有人可以幫助我如何防止重複的http請求?用修飾器還是修改http服務?謝謝。 – edgaraafelix

+0

我有同樣的問題,我看到我用ng-controller **和**'$ routeProvider.when('/ route',{controller:'MyController',...});' – KmeCnin

2

我都面臨着這個問題,你可以解決它像這樣:

檢查,如果您已聲明NG-控制器兩次,你需要聲明它只是一個時間 檢查,如果您已聲明數據NG-點擊,如果是這樣,你需要用ng-click代替它 就是這樣

+2

我有同樣的問題,我看到我用ng-controller **和**'$ routeProvider.when('/ route',{controller:'MyController',...});' – KmeCnin

+1

對我來說也是一樣:我在'$ routeProvider'和HTML中指定了控制器名稱 - 這就是請求翻倍的原因 – olyv