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.
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.