Другой if (! $ Scope. $$ phase) $ scope. $ Apply () szenario - нужна помощь для очистки

0

У меня есть угловая форма с динамическим множеством подформ. Первая форма не будет сбрасываться после отправки, и подформы будут сброшены на каждой отправке.

Мы можем использовать эту форму более одного раза, если пользователь не перезагружает страницу. Поэтому после проверки и отправки я не сбрасываю первую форму, но позволяю пользователю снова щелкнуть ее, и он может добавить некоторые дополнительные подформы (если ничего не изменится).

Проверка выполняется только в том случае, если пользователь нажимает кнопку "Отправить", поэтому переменная области 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;

Надеюсь, вы могли бы понять мою проблему, извините за плохой английский

  • 0
    Пожалуйста, предоставьте MCVE для ситуации, которую вы описываете, предпочтительно в форме скрипки / планки.
Теги:
validation
forms
angularjs-scope

1 ответ

0

$scope.$apply и $scope.$digest предназначены для выполнения в обратных setImmediate, которые выполняются асинхронно (после начального цикла дайджеста): запросы AJAX, setTimeout/setInterval/setImmediate, non- $q обещает, прослушиватели событий DOM и т.д.

Угловая работа - это каркас, который автоматически выполняет все асинхронные встроенные функции ($http, $timeout, директивы) и обрабатывает задание. Хорошо продуманные сторонние расширения делают то же самое.

Причина, почему !$scope.$$phase && $scope.$digest() можно считать антипаттерном, так это то, что в хорошо сформированном приложении разработчик всегда знает, выполняется ли код для дайджеста или нет, поэтому эта проверка избыточна. И если это не так, это показатель некоторых недостатков в дизайне приложений.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню