[英]AngularJS How to prevent duplicated http requests?
我在過去的一天中遇到了一些奇怪的情況。 發生的事情是,對於遠程服務器上的API的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();
}
};
提前謝謝..希望有人能幫幫我...
我遇到過這個問題,你可以這樣解決:
檢查你是否已經聲明ng-controller兩次,你需要聲明它只是一次檢查你是否已聲明data-ng-click,如果是,你需要用ng-click替換它就是它
我看到了你的鏈接:
$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;
};
我希望這有幫助。
我傾向於從工廠返回一個物體,所以在你的情況下我會做類似的事情:
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(){...})
}
可能沒有幫助你,但我從來沒有遇到任何重復調用這樣做的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.