タイトルが示すように、ngMessagesIncludeは、親ngMessagesがDOMから削除された後に処理されます。 角度が内部メッセージをリンクするための親コントローラーを見つけることができないため、失敗します。 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)は、DOMからのngMessages
とその子の削除を続行します。 後で、ngMessagesIncludeコンテンツが到着し、angularがそれをコンパイルします。 しかし、その時点では、 ngMessages
コントローラーを取得する方法はもうありません。
Plnkr: http ://plnkr.co/edit/0GOOLERvfj7n9vDVEyZp?p = preview
ほとんどの場合、それはngIf
条件と一緒に発生します。
バージョン1.4.4に対してテスト済み。
私はそれを回避する方法を見つけました:
ng-if="myForm.$submitted && myForm.myName.$invalid"
コンポーネント側でこれを解決するには、 require: '^^ngMessages'
オプションにして、リンク中にその状態を確認します。
簡単な修正は、ngMessagesIncludeでHTMLをコンパイル/リンクする前に、スコープが破棄されているかどうかを確認することです。
$templateRequest(src).then(function(html) {
if (scope.$$destroyed) return;
// ...
}
これが、ngIncludeが同じシナリオを処理する方法です。
これを処理することは、 ngInclude
が合理的に聞こえるのと同様の方法です。
@awerlangまたは@ jpekkala 、PRの提出に興味がありますか?
承知しました。 数日以内にPRを提出します。