У меня есть угловая форма с динамическим множеством подформ. Первая форма не будет сбрасываться после отправки, и подформы будут сброшены на каждой отправке.
Мы можем использовать эту форму более одного раза, если пользователь не перезагружает страницу. Поэтому после проверки и отправки я не сбрасываю первую форму, но позволяю пользователю снова щелкнуть ее, и он может добавить некоторые дополнительные подформы (если ничего не изменится).
Проверка выполняется только в том случае, если пользователь нажимает кнопку "Отправить", поэтому переменная области subFormSubmitted получает значение true, и требуемая ошибка по-прежнему верна. например
subForm.salutation.$error.required && subFormSubmitted
На первом pageload - все работает отлично. Когда я пытаюсь представить подчиненную форму, не введя что-либо, будет показана требуемая проверка.
Проблема в том, что после того, как он представил форму в первый раз, и он ничего не меняет в первой форме, и во второй раз он переходит к динамическим формам и просто нажимает на submit, не вводя чего-либо, модель не получить обновление и не показывать валидацию, хотя переменные области имеют правильное значение. Переменные
subForm.salutation.$error.required && subFormSubmitted
оценивает значение true, когда я проверяю его в webdeveloper. Однако, когда я фокусирую ввод и набираю что-то, требуемая проверка немедленно появляется на других входах. Кроме того, когда я что-то меняю в первой форме, а затем вводим подформы, проверка правильности отображается, когда я нажимаю кнопку submit.
Поэтому я подумал, что это может быть проблемой при применении области.
Что я сделал после некоторых попыток и ошибок, я получил решение, которое работает:
я добавил
if (!$scope.$$phase) {
$scope.$digest();
}
к функции области, которая вызывается, когда я нажимаю submit.
Это прекрасно работает, но после некоторых исследований я выяснил, что это анти-шаблон: почему используется if (! $ Scope. $$ phase) $ scope. $ Apply() анти-шаблон?
Итак, может кто-то мне помочь и рассказать мне, что "правильный" способ решить эту проблему?
В основном я контролирую видимость форм с помощью ng-show = firstFormSubmitted.
$scope.addSubForm = function() {
$scope.firstFormSubmitted = true;
Надеюсь, вы могли бы понять мою проблему, извините за плохой английский
$scope.$apply
и $scope.$digest
предназначены для выполнения в обратных setImmediate
, которые выполняются асинхронно (после начального цикла дайджеста): запросы AJAX, setTimeout
/setInterval
/setImmediate
, non- $q
обещает, прослушиватели событий DOM и т.д.
Угловая работа - это каркас, который автоматически выполняет все асинхронные встроенные функции ($http
, $timeout
, директивы) и обрабатывает задание. Хорошо продуманные сторонние расширения делают то же самое.
Причина, почему !$scope.$$phase && $scope.$digest()
можно считать антипаттерном, так это то, что в хорошо сформированном приложении разработчик всегда знает, выполняется ли код для дайджеста или нет, поэтому эта проверка избыточна. И если это не так, это показатель некоторых недостатков в дизайне приложений.