Angular.js: ngMessagesInclude wird verarbeitet, nachdem das übergeordnete ngMessages aus DOM entfernt wurde

Erstellt am 27. Aug. 2015  ·  3Kommentare  ·  Quelle: angular/angular.js

Wie der Titel sagt, wird ngMessagesInclude verarbeitet, nachdem das übergeordnete ngMessages aus dem DOM entfernt wurde. Es schlägt fehl, weil angle den übergeordneten Controller zum Verknüpfen innerer Nachrichten nicht finden kann. Es passiert nicht, wenn ngMessage 's in das ngMessages Element eingebettet sind oder während das übergeordnete Element noch im DOM vorhanden ist.

Habe eine ng-Nachricht wie diese:

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

Die Übermittlung wird ausgelöst durch:

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

Bei Ereignis (A) wird messages.html heruntergeladen. Da $templateRequest , wird die Verknüpfung angehalten, bis der Server zurückkehrt. In der Zwischenzeit wird bei Ereignis (B) ngMessages und seine untergeordneten Elemente aus DOM entfernt. Später kommt der Inhalt von ngMessagesInclude und angle wird ihn kompilieren. Aber an diesem Punkt gibt es keine Möglichkeit mehr, ngMessages Controller abzurufen.

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

Meistens geschieht dies zusammen mit einer ngIf Bedingung.

Getestet gegen Version 1.4.4.

Ich habe einen Weg gefunden, das zu vermeiden:

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

Um das auf der Komponentenseite zu lösen, könnte require: '^^ngMessages' optional gemacht werden und diese Bedingung während des Linkens überprüfen.

ngMessages low confusing bug

Alle 3 Kommentare

Eine einfache Lösung wäre zu überprüfen, ob der Bereich zerstört wurde, bevor der HTML-Code in ngMessagesInclude kompiliert/verknüpft wird:

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

So handhabt ngInclude dasselbe Szenario.

Dies zu handhaben ist ähnlich wie ngInclude vernünftig klingt.
@awerlang oder @jpekkala , hätten Sie Interesse an einer PR ?

Sicher. Ich werde in ein paar Tagen eine PR einreichen.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen