このjsFiddleでテストできます:こちら (新しいjsFiddleで確認することをお勧めします。この投稿の編集部分を参照してください)
AngularJS にバグがあるか、少なくとも期待どおりの結果ではないと思います。フォームをデタッチしてから再追加すると、DOM に再追加するクラスng-invalid
スイッチになります。ng-valid
これにより、データが有効でない場合でもフォームの送信ボタンが有効になります。もちろん、有効ステータスが切り替わらないことを期待していました。
これは角度のあるバグだと思いますが、おそらくjqueryのバグです。jquery を使用して追加をチェックし、フォームが有効かどうかを確認してからフォーム クラスを強制することもできますが、有効なフォームが無効のステータスを取得するので機能していないようです。デタッチする前にステータスフォームを保存するためにある種のデータを使用しないと、他の回避策がわからないので、それは非常に奇妙です。
では、すでにこの問題に遭遇した人はいますか? このバグを取り除く方法 (可能であれば AngularJS ディレクティブを使用) はありますか?
PS: DOM をできるだけきれいに保つために、単一ページの Web アプリケーションでフォーム (およびその他の要素) を切り離す必要があります。
編集
私の問題をさらに説明する新しいjsFiddleを実行し、内部サイトナビゲーションのコンテンツを切り離しました: http://jsfiddle.net/EWVwa/
アップデート
この一時的な解決策にたどり着きました(CaioToOnのおかげです)
var app = angular.module('plunker', []);
app.controller('MainCtrl', function($scope) {
$scope.name = 'World';
});
app.directive('customValidation', function() {
return {
require: ['ngModel', '^?form'],
link: function(scope, element, attr, ctrls) {
console.log(ctrls);
var ngModelCtrl = ctrls[0],
formCtrl = ctrls[1];
ngModelCtrl.$parsers.push(function(viewValue) {
if (viewValue === 'test') {
ngModelCtrl.$setValidity('name', true);
formCtrl.$setValidity('name', true);
return viewValue;
} else {
ngModelCtrl.$setValidity('name', false);
formCtrl.$setValidity('name', false);
return undefined;
}
});
// custom event
element.bind('$append', function() {
formCtrl && formCtrl.$addControl(ngModelCtrl);
/*** TEST for to keep form's validation status ***/
formCtrl.$setValidity('name', ngModelCtrl.$valid);
//ngModelCtrl.$setValidity('name', ngModelCtrl.$valid);
console.log(formCtrl.$valid);
});
//binding on element, not scope.
element.bind('$destroy', function() {
console.log("gone haven");
});
}
};
});
これには、複数の入力の検証に関するより多くのテストが必要です。すべてのテストが完了したら、必ず回答を更新します。