Как отображать сообщение ожидания в AngularJS при загрузке данных?

Я новичок в AngularJS и пытаюсь найти способ отображения сообщения ожидания при загрузке данных? Я имею в виду, что данные начинают загружаться, выводить сообщение и удалять его при загрузке данных.

Я искал интернет, но не нашел ничего, что мне нужно...

Ответы

Ответ 1

<div ng-if="data.dataLoading">
    Loading...
</div>

JS

$scope.data.dataLoading = true;

return someService.getData().then(function (results) {                    
    ...
}).finally(function () {
    $scope.data.dataLoading = false;
});

Ответ 2

Зависит от того, где вы загружаете данные. Одним из решений, которое я использовал, было создание LoadService

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

Ответ 3

Изменить: не работает в версии 1.3.0. Используйте перехватчики запросов/ответов.

Если вы хотите прослушивать все запросы по всему миру и отображать виджет загрузки всякий раз, когда ожидающий запрос, вы можете подсчитать запросы, используя преобразователи запроса/ответа. Вы просто добавляете счетчик и увеличиваете новый запрос и уменьшаете его при ответе. Я использую для этого провайдера:

$httpProvider
  .defaults
  .transformRequest
  .push(function(data) {
      requestNotificationProvider
      .fireRequestStarted(data);
      return data;
});

И то же самое для transformResponse. Затем тот же провайдер хранит информацию о том, сколько запросов ожидает ответа, и вы можете использовать их в директиве. Вы можете прочитать (& copy/paste code) полную запись в блоге по этому поводу здесь: http://www.kvetis.com/2014/01/angularjs-loading-widget.html Там прилагается рабочая демонстрация.

Ответ 4

Я не знаю, правильно ли это, но я надел свой шаблон

 <img id="spinner" ng-src="images/spinner.gif" ng-if="!data" >
 <div ng-repeat="repo in repos | orderBy: repoSortOrder">...</div>

Ответ 5

Я ответил на этот вопрос в fooobar.com/info/249222/..., но здесь был краткий обзор того, что я сделал.

Если вы правильно нарисуете свой код и убедитесь, что все вызовы веб-службы проходят через одну функцию factory, то вы можете сделать этот дескриптор функции factory отображающим и скрывающим ваш " Подождите, пожалуйста.

Здесь функция factory, которую я использую для вызова всех моих веб-сервисов GET:

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 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 может загружать данные из веб-службы всего несколькими строками и оставлять factory для просмотра после отображения/скрытия сообщения "Подождите" и отображения любых ошибок которые происходят:

   $scope.LoadAllSurveys = function () {
        DataService.dsLoadAllSurveys($scope).then(function (response) {
            //  Success
            $scope.listOfSurveys = response.GetAllSurveysResult;
        });
   }

Ницца, эй?