mam odpowiedzieć na to pytanie w this StackOverflow article, ale tutaj jest podsumowanie tego, co zrobiłem.
Jeśli styl kod poprawnie i czy wszystkie połączenia z przepustki usług internetowych poprzez jeden szczególności factory
funkcji, to można zrobić, że uchwyt factory
funkcja pokazywanie i ukrywanie swojego „Please Wait” okienko.
Oto funkcja factory
którego używam zadzwonić wszystkich moich GET internetowych usług:
myApp.factory('httpGetFactory', function ($http, $q) {
return function (scope, URL) {
// This Factory method calls a GET web service, and displays a modal error message if something goes wrong.
scope.$broadcast('app-start-loading'); // Show the "Please wait" popup
return $http({
url: URL,
method: "GET",
headers: { 'Content-Type': undefined }
}).then(function (response) {
scope.$broadcast('app-finish-loading'); // Hide the "Please wait" popup
if (typeof response.data === 'object') {
return response.data;
} else {
// invalid response
return $q.reject(response.data);
}
}, function (errorResponse) {
scope.$broadcast('app-finish-loading'); // Hide the "Please wait" popup
// The WCF Web Service returned an error.
// Let's display the HTTP Status Code, and any statusText which it returned.
var HTTPErrorNumber = (errorResponse.status == 500) ? "" : "HTTP status code: " + errorResponse.status + "\r\n";
var HTTPErrorStatusText = errorResponse.statusText;
var message = HTTPErrorNumber + HTTPErrorStatusText;
BootstrapDialog.show({
title: 'Error',
message: message,
buttons: [{
label: 'OK',
action: function (dialog) {
dialog.close();
},
draggable: true
}]
});
return $q.reject(errorResponse.data);
});
};
});
To sprawdzony tak:
myApp.webServicesURL = "http://localhost:15021/Service1.svc";
var dsLoadAllEmployees = function (scope)
{
// Load all survey records, from our web server
$scope.LoadingMessage = "Loading Employees data...";
var URL = myApp.webServicesURL + "/loadAllEmployees";
return httpGetFactory(scope, URL);
}
Oto „Proszę czekać” kontrolę które użyj na każdej stronie ..
<please-wait message="{{LoadingMessage}}" ></please-wait>
... a jego kod wygląda tak ...
myApp.directive('pleaseWait',
function ($parse) {
return {
restrict: 'E',
replace: true,
scope: {
message: '@message'
},
link: function (scope, element, attrs) {
scope.$on('app-start-loading', function() {
element.fadeIn();
});
scope.$on('app-finish-loading', function(){
element.animate({
top: "+=15px",
opacity: "0"
}, 500);
});
},
template: '<div class="cssPleaseWait"><span>{{ message }}</span></div>'
}
});
Korzystanie z tej struktury, każde z moich kątowe kontrolerów może wczytać dane z usługi internetowej w zaledwie kilku linii, i opuszcza fabrykę opiekować pokazywanie/ukrywanie się komunikat „proszę czekać” i wyświetla żadnych błędów które występują:
$scope.LoadAllSurveys = function() {
DataService.dsLoadAllSurveys($scope).then(function (response) {
// Success
$scope.listOfSurveys = response.GetAllSurveysResult;
});
}
Ładne, hej?
Jeśli chcesz wyświetlić wskaźnik ładowania połączeń usług internetowych, istnieje również sposób na przechwycenie połączeń HTTP. Istnieje kilka postów na blogu, jak wdrożyć taki przechwytujący. Dobry jest następujący: http://codingsmackdown.tv/blog/2013/01/02/using-response-interceptors-to-show-and-hide-a-loading-widget/ – Stephan