Используя Angularjs, мне нужно показывать экран загрузки (простой счетчик), пока запрос ajax не будет завершен. Пожалуйста, предложите любую идею с помощью фрагмента кода.
angularjs
angularjs-directive
Бадхринатх Канессане
источник
источник
$httpProvider.interceptors
поскольку он может обрабатывать, когда запускается и когда заканчивается запрос ajax. Вот почему$watch
больше не нужно определять, когда начинается и заканчивается вызов ajax.Ответы:
Вместо того, чтобы настраивать переменную области видимости для индикации статуса загрузки данных, лучше иметь директиву, которая сделает все за вас:
С помощью этой директивы все, что вам нужно сделать, это присвоить любому элементу анимации загрузки атрибут 'loading':
На странице может быть несколько загрузочных счетчиков. где и как расположить эти счетчики, зависит от вас, и директива просто включит / выключит его для вас автоматически.
источник
Вот вам пример. Он использует простой метод ng-show с логическим значением.
HTML
ANGULARJS
Конечно, вы можете переместить html-код окна загрузки в директиву, а затем использовать $ watch для $ scope.loading. В таком случае:
HTML :
ДИРЕКТИВА ANGULARJS :
ПЛАНК : http://plnkr.co/edit/AI1z21?p=preview
источник
ui-router
, не знаю почемуloading=true
не устанавливаетсяДля этого я использую ngProgress .
Добавьте «ngProgress» к своим зависимостям после того, как вы включили файлы сценария / css в свой HTML. Как только вы это сделаете, вы можете настроить что-то вроде этого, которое будет срабатывать при обнаружении изменения маршрута.
Для запросов AJAX вы можете сделать что-то вроде этого:
Просто не забудьте добавить 'ngProgress' к зависимостям контроллеров перед этим. И если вы выполняете несколько запросов AJAX, используйте инкрементную переменную в основной области приложения, чтобы отслеживать, когда ваши запросы AJAX завершились, перед вызовом 'ngProgress.complete ();'.
источник
использование pendingRequests неверно, потому что, как упоминалось в документации Angular, это свойство в первую очередь предназначено для использования в целях отладки.
Я рекомендую использовать перехватчик, чтобы узнать, есть ли активный вызов Async.
а затем проверьте, равно ли activeCalls нулю в директиве с помощью $ watch.
источник
Лучший способ сделать это - использовать перехватчики ответов вместе с настраиваемой директивой . И процесс может быть дополнительно улучшен с помощью механизма pub / sub с использованием методов $ rootScope. $ Broadcast & $ rootScope. $ On .
Поскольку весь процесс задокументирован в хорошо написанной статье в блоге , я не собираюсь повторять это здесь снова. Пожалуйста, обратитесь к этой статье, чтобы найти необходимую вам реализацию.
источник
В отношении этого ответа
https://stackoverflow.com/a/17144634/4146239
Для меня это лучшее решение, но есть способ избежать использования jQuery.
Вам нужно заменить $ (element) .show (); и (элемент) .show (); с $ scope.loadingStatus = 'true'; и $ scope.loadingStatus = 'false';
Затем вам нужно использовать эту переменную для установки атрибута ng-show элемента.
источник
Машинопись и реализация на Angular
директива
Объем
шаблон
источник
Если вы используете Restangular (что круто), вы можете создавать анимацию во время вызовов API. Вот мое решение. Добавьте перехватчик ответа и перехватчик запроса, который отправляет широковещательную рассылку rootcope. Затем создайте директиву для прослушивания этого ответа и запроса .:
Вот директива:
источник
Включите это в свой "app.config":
И добавьте этот код:
источник
Используйте angular-busy :
Добавьте cgBusy в свое приложение / модуль:
Добавьте свое обещание в
scope
:В вашем шаблоне html:
источник
Кроме того, есть хорошая демонстрация, показывающая, как можно использовать
Angularjs
анимацию в своем проекте.Ссылка здесь (см. Левый верхний угол) .
Это открытый исходный код. Вот ссылка для скачивания
А вот ссылка на учебник ;
Я хочу сказать, скачайте исходные файлы и посмотрите, как они реализовали счетчик. Они могли бы использовать более подходящий подход. Итак, ознакомьтесь с этим проектом.
источник
Вот простой пример перехватчика, я устанавливаю мышь на ожидание, когда запускается ajax, и устанавливаю его в автоматический режим, когда ajax заканчивается.
Код необходимо добавить в конфигурацию приложения
app.config
. Я показал, как изменить мышь в состоянии загрузки, но там можно показать / скрыть любое содержимое загрузчика или добавить, удалить некоторые классы css, которые показывают загрузчик.Перехватчик будет запускаться при каждом вызове ajax, поэтому нет необходимости создавать специальные логические переменные ($ scope.loading = true / false и т. Д.) При каждом вызове http.
Перехватчик использует встроенный в angular jqLite https://docs.angularjs.org/api/ng/function/angular.element, поэтому JQuery не требуется.
источник
Создайте директиву с атрибутами show и size (вы также можете добавить больше)
а в html используйте как
В переменной show передайте значение true, когда выполняется любое обещание, и сделайте это false, когда запрос завершен. Активная демонстрация - демонстрация примера директивы Angular Loader в JsFiddle
источник
Я построил ответ @DavidLin, чтобы немного упростить его - убрав любую зависимость от jQuery в директиве. Я могу подтвердить, что это работает, поскольку я использую его в производственном приложении
Я использую
ng-show
вместо вызова jQuery, чтобы скрыть / показать<div>
.Вот тот,
<div>
который я разместил чуть ниже открывающего<body>
тега:И вот CSS, который обеспечивает наложение для блокировки пользовательского интерфейса во время вызова $ http:
Кредит CSS принадлежит @Steve Seeger - его сообщение: https://stackoverflow.com/a/35470281/335545
источник
Вы можете добавить условие, а затем изменить его с помощью rootcope. Перед запросом ajax вы просто вызываете $ rootScope. $ Emit ('stopLoader');
Это определенно не лучшее решение, но оно все равно работает.
источник