Angular.js: ngMessagesInclude обрабатывается после удаления родительского ngMessages из DOM

Созданный на 27 авг. 2015  ·  3Комментарии  ·  Источник: angular/angular.js

Как сказано в заголовке, ngMessagesInclude обрабатывается после удаления родительского ngMessages из DOM. Это не удается, потому что angular не может найти родительский контроллер для связывания внутренних сообщений. Этого не происходит, когда ngMessage встроены внутри элемента ngMessages или пока родительский элемент все еще присутствует в DOM.

Создайте такие ng-сообщения:

<div ng-if="myForm.$submitted" ng-messages="myForm.myName.$error">
  <div ng-messages-include="messages.html"></div>
</div>

Подача инициируется:

this.change = function(myForm) {
  var self = this;
  myForm.$setSubmitted();    // event A
  $scope.$applyAsync(function () {
    self.currentStep = 'step2.html';     // event B
  });
};

В событии (A) загружается messages.html . Поскольку он использует $templateRequest , связывание останавливается, пока сервер не вернется. Между тем, событие (B) продолжается с удалением ngMessages и его дочерних элементов из DOM. Позже прибывает контент ngMessagesInclude, и angular его скомпилирует. Но в этот момент нет возможности получить контроллер ngMessages .

Plnkr: http://plnkr.co/edit/0GOOLERvfj7n9vDVEyZp?p=preview

В большинстве случаев это происходит вместе с условием ngIf .

Проверено на версии 1.4.4.

Я нашел способ избежать этого:

ng-if="myForm.$submitted && myForm.myName.$invalid" 

Чтобы решить эту проблему на стороне компонента, require: '^^ngMessages' можно сделать необязательным и проверять это условие во время связывания.

ngMessages low confusing bug

Все 3 Комментарий

Простое исправление - проверить, была ли уничтожена область видимости перед компиляцией / связыванием HTML в ngMessagesInclude:

$templateRequest(src).then(function(html) {
    if (scope.$$destroyed) return;
    // ...
}

Вот как ngInclude обрабатывает тот же сценарий.

Обработка этого способа аналогична тому, что ngInclude звучит разумно.
@awerlang или @jpekkala , не могли бы вы подать PR?

Конечно. Я отправлю PR в течение пары дней.

Была ли эта страница полезной?
0 / 5 - 0 рейтинги