我是AngularJS的新手并试图找到在数据加载时如何显示等待消息的方法?我的意思是数据开始加载,显示消息并在数据加载完成后将其删除。
我在互联网上搜索但没找到我需要的东西......
答案 0 :(得分:44)
<div ng-if="data.dataLoading">
Loading...
</div>
JS
$scope.data.dataLoading = true;
return someService.getData().then(function (results) {
...
}).finally(function () {
$scope.data.dataLoading = false;
});
答案 1 :(得分:5)
取决于您加载数据的位置。我使用的一个解决方案是创建一个LoadingService
app.factory('LoadingService', function($rootScope) {
return {
loading : function(message) {
$rootScope.loadingMessage = message;
},
loaded : function() {
$rootScope.loadingMessage = null;
}
}
}).controller('FooController', function($scope,$http,LoadingService) {
$scope.loadSomeData = function() {
LoadingService.loading('Data is loading');
$http.get('/data').finally(function() {
LoadingService.loaded();
});
};
});
由于我只有一个显示消息的地方,我可以使用RootScope来处理这个问题。如果你想多次加载一条消息,你也可以编写一个指令来处理这个,就像Codezilla发布的那样
答案 2 :(得分:1)
编辑:在版本1.3.0上不起作用。使用请求/响应拦截器。
如果您希望全局侦听所有请求并在请求待处理时显示加载小部件,则可以使用request/response transformers对请求进行计数。您只需添加一个计数器并增加一个新请求,并在响应时减少它。我使用提供者:
$httpProvider
.defaults
.transformRequest
.push(function(data) {
requestNotificationProvider
.fireRequestStarted(data);
return data;
});
transformResponse
也一样。然后,同一个提供程序会保存有关待处理请求数的信息,您可以在指令中使用它们。您可以在此处阅读(并复制/粘贴代码)完整的博客文章:
http://www.kvetis.com/2014/01/angularjs-loading-widget.html附件中有一个工作演示。
答案 3 :(得分:0)
我不知道是否是正确的方法,但我放了我的模板
<img id="spinner" ng-src="images/spinner.gif" ng-if="!data" >
<div ng-repeat="repo in repos | orderBy: repoSortOrder">...</div>
答案 4 :(得分:0)
我已经在this StackOverflow article回答了这个问题,但这里回顾了我的所作所为。
如果您正确设置代码样式,并确保所有对Web服务的调用都通过一个特定factory
函数,那么您可以使factory
函数句柄显示并隐藏你的“请等待”弹出窗口。
以下是factory
函数,用于调用我的所有GET Web服务:
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);
});
};
});
这会被这样调用:
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);
}
这是我在每页上使用的“请稍候”控件..
<please-wait message="{{LoadingMessage}}" ></please-wait>
......它的代码看起来像这样......
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>'
}
});
使用这种结构,我的任何Angular控制器都可以在几行中加载来自Web服务的数据,并离开工厂以显示/隐藏“请稍候”消息,并显示出现的任何错误: / p>
$scope.LoadAllSurveys = function () {
DataService.dsLoadAllSurveys($scope).then(function (response) {
// Success
$scope.listOfSurveys = response.GetAllSurveysResult;
});
}
很好,嘿?