2016-01-13 2 views
0

Как следует из названия, я пытаюсь отправить форму через Angular, и я хочу иметь небольшой загрузочный div, который отображается, пока выполняется действие отправки. Вот что я сейчас имею в виду.Показывать элемент, пока форма AngularJS отправляет

Вид:

<div ng-app="SomeApp"> 
    <div ng-controller="SomeController" ng-init="submitting = false"> 
     <div id="LoadingOverlay" class="loadoverlay" ng-show="submitting"> 
      <img src="~/Content/img/loader.gif" class="loadspin" alt="Loading" /> 
     </div> 
     <form class="form-horizontal" role="form" ng-submit="submit()"> 
      <!-- Some Form Controls Going On Here --> 
     </form> 
    </div> 
</div> 

JS:

var setupApp = angular.module("SomeApp", []); 
setupApp.controller("SomeController", function ($scope, $http) { 
    $scope.submit = function() { 
     $scope.submitting = true; 
     // Carry out the submit actions 
     $scope.submitting = false; 
    }; 
}); 

Я попытался изменить подавшее заявку BOOL с нг нажмите на кнопку отправки, я попытался JQuery, и я попытался в основном некоторое угловое обертку для $() .hide(), ни один из которых не показывает загрузку gif во время выполнения действий отправки.

Я должен отметить, что действия отправки (материал прокомментирован) работают так, как я ожидал бы, все, что я делаю в подающем угловом действии, - это вызов ajax с $ http и сообщение об успешном завершении.

Я нашел пару страниц с некоторыми довольно сложными поисковыми решениями, поэтому я хотел сначала приехать сюда, так как загрузка gif на форме submit - это то, что, по моему мнению, должно быть относительно простым.

+0

ли параметр '$ scope.submitting = false' в $ обработка ответов HTTP или вне этого? Если снаружи, то, возможно, вы устанавливаете его на видимое, а затем сразу же снова становитесь невидимым. Ваша основная концепция выглядит для меня звуком. – Danny

ответ

1

То, как вы ваш псевдо-код выкладывается он выглядит, как вы могли бы сделать что-то вроде:

Неправильная версия

var setupApp = angular.module("SomeApp", []); 
setupApp.controller("SomeController", function ($scope, $http) { 
    $scope.submit = function() { 
     $scope.submitting = true; 

     // Carry out the submit actions 
     $http({ 
      method: 'POST', 
      url: '/someUrl' 
     }).then(function successCallback(response) { 
      // this callback will be called asynchronously 
      // when the response is available 
     }, function errorCallback(response) { 
      // called asynchronously if an error occurs 
      // or server returns response with an error status. 
     }); 

     $scope.submitting = false; 
    }; 
}); 

Если это так, то вы делаете ваше загрузочное изображение видно, инициируйте свой запрос $http, а затем сразу же отключите флаг отправки. Вы хотите поставить $scope.submitting = false; внутри вашей функции обратного вызова, а не вне процесса асинхронной, как это:

Правая версия:

 $scope.submitting = true; 

     // Carry out the submit actions 
     $http({ 
      method: 'POST', 
      url: '/someUrl' 
     }).then(function successCallback(response) { 
      // this callback will be called asynchronously 
      // when the response is available 
      $scope.submitting = false; 
      // do stuff 

     }, function errorCallback(response) { 
      // called asynchronously if an error occurs 
      // or server returns response with an error status. 
      $scope.submitting = false; 
      // do stuff 

     }); 
+0

Вы бы поставили $ scope.submitting = false; внутри того, что вы называете successCallback (разрешение обещания) И внутри метода errorCallback. Вы можете использовать функции anon. Поскольку это означает scope.submitting = false будет выполняться немедленно, что не то, чего хочет ассер. – danday74

+0

гораздо лучше славный код :) хотя POST скорее всего подходит для отправки – danday74

+0

Да, я показывал, что, по-моему, он делает в коде, а потом сказал, что он должен изменить, но я этого не показывал, и это был немного запутанным. Для ясности была добавлена ​​явная исправленная версия. – Danny

1

в вашем $ scope.submit вы делаете ...

$scope.submit = function() { 
    $scope.submitting = true; 
    var postData = {name:"fred"}; 
    $http.post("/your/url", postData).then(function(response) { 
     // Carry out the success actions 
     $scope.submitting = false; 
    }).catch(function(error) { 
     // Carry out the failure actions 
     $scope.submitting = false; 
    }); 
}; 

Это работает, потому что служба $ HTTP возвращает обещание. У Promise есть метод THEN, который выполняется, когда запрос $ http завершен. Блок catch выполняется с ответом не на 200 HTTP или при отказе (например, тайм-аут).

+1

Я бы предположил, что они используют '.finally (function() {$ scope.submitting = false;})', чтобы избежать дублирования кода, так как 'finally' запускается для сценариев * success * и * failure *. – jusopi

+0

jusopi полезный совет спасибо – danday74

Смежные вопросы