Angular.js: 親ngMessagesがDOMから削除された後に処理されるngMessagesInclude

作成日 2015年08月27日  ·  3コメント  ·  ソース: angular/angular.js

タイトルが示すように、ngMessagesIncludeは、親ngMessagesがDOMから削除された後に処理されます。 角度が内部メッセージをリンクするための親コントローラーを見つけることができないため、失敗します。 ngMessagengMessages要素内にインライン化されている場合、または親要素がまだ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'オプションにして、リンク中にその状態を確認します。

ngMessages low confusing bug

全てのコメント3件

簡単な修正は、ngMessagesIncludeでHTMLをコンパイル/リンクする前に、スコープが破棄されているかどうかを確認することです。

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

これが、ngIncludeが同じシナリオを処理する方法です。

これを処理することは、 ngIncludeが合理的に聞こえるのと同様の方法です。
@awerlangまたは@ jpekkala 、PRの提出に興味がありますか?

承知しました。 数日以内にPRを提出します。

このページは役に立ちましたか?
0 / 5 - 0 評価