Как в AngularJS сделать формы неактивными во время сабмита (глобально)?
Всем привет!
Есть форма, в ней есть <fieldset ng-disabled="processing">
при сабмите формы, в контроллере я $scope.processing устанавливаю в true, после окончания выполнения метода контроллера, соответственно, устанавливаю в false.
В пределах небольшого кол-ва форм это можно все прописать руками, но задумался, нет ли какого-то более глобального метода?
Дополняю вопрос, так как, видимо, не очень понятно объяснил.
Я знаю, как сделать такой функционал в пределах одной формы. Но на сайте будет довольно большое количество форм, которые обрабатываются разными контроллерами. Я хочу понять, возможно ли добавить такой функционал всем формам по умолчанию (допустим, с прописыванием какой-то директивы).
То есть. Я знаю, что можно в методе сабмита формы установить сначала processing в true. Затем, когда метод выполнится, установить processing в false. Так вот, я хочу добавить эту установку processing в true и, затем, в false во все методы сабмита формы. И в будущие тоже.
То есть, допустим, я описываю форму не тегом "form", а тегом "myForm", который обрабатывается какой-то директивой, которая при сабмите устанавливает processing в true, затем вызывает реальный метод сабмита, тот, который прописан в форме, а затем, после окончания реального метода, устанавливает processing в false. Чтобы не писать одно и то же управление переменной processing в каждом методе сабмита.
Надеюсь теперь понятнее объяснил
Заранее спасибо!
Можно написать директиву для формы, можно определить директиву fieldset что бы не менять разметку...
Если для формы, вы можете назначать атрибуту промис, и внутри директивы трекать что когда закончится. По окончанию действия ресетить промис и ждать следующего. Ну и т.д. Так можно почистить контроллер от ненужных вещей.
Я изменил вопрос, возможно теперь станет понятнее, что я хочу. По ссылке инструкция для одной формы. Но для одной формы у меня итак работает. И для двух, и для трех. Пока я руками в контроллере прописываю управление переменной "processing". А я хочу управление этой переменной отдать глобальной функции (в вопросе расписал)
Сергей Протько: Не смог сам сделать, посмотрел Ваше решение, я правильно понимаю, что с его использованием придется всегда оборачивать функцию сабмита еще в одну? Чтобы было, что отслеживать? И еще, не могу понять, Ваше решение будет работать с асинхронными запросами?
Антон Иванов: вся соль в том что мы просто экспортируем в scope промис (читать про промисы обязательно). Кто именно его генерит, асинхронный ивент (у меня как раз такой), $http или что-то еще - не суть вообще. В Angular все асинхронное кидает промисы.
Сергей Протько: У меня не работал Ваш вариант, пока я не обернул функцию сабмита в $q(). Но это можно проверить и сделать в самой директиве. Осталось убрать необходимость создавать новую переменную в submit() и задача будет решена :)
Антон Иванов: что значит "функцию сабмита в $q"? Функция сабмита должна просто вернуть промис. А от переменной вы не избавитесь. Ну то есть можно конечно (ивентами, интерцепторами и т.д.) но это сложнее как разрабатывать так и поддерживать.
Сергей Протько: Да, именно для того, чтобы это была не просто функция, а промис я и сделал $q(function(resolve, reject){ myFunction }). Отмечу ответ, как решение, так как лучше, похоже, ничего нет :)
Спасибо