数据加载时如何在AngularJS中显示等待消息?

时间:2013-08-21 13:13:03

标签: angularjs

我是AngularJS的新手并试图找到在数据加载时如何显示等待消息的方法?我的意思是数据开始加载,显示消息并在数据加载完成后将其删除。

我在互联网上搜索但没找到我需要的东西......

5 个答案:

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

很好,嘿?