ctrl.$setValidity
ディレクティブの 1 つで使用して、フォームを無効にします。ただし、別の条件でこの要素を DOM から削除できるメソッドが別の場所にあります。フォームを無効にし$setValidity
て問題のある要素を削除すると、フォームは無効のままになりますが、新しい Inputfield セットに基づいて有効性を再計算する必要があります。
単に , を探しているわけではないことに注意してくださいctrl.$setValidity true
(フォームの他の入力フィールドが有効である場合と無効である場合があります)。フォームを再計算するだけです。
以下は、ディレクティブ コードです。
app.directive('dir', function() {
return {
restrict: 'C',
require: "ngModel",
link: function(scope, element, attrs, ctrl) {
someValue = scope.someValue;
someField = element.find(".some-class");
monitorField = function(newValue, oldValue){
console.log("whee");
scope.someFunction(newValue);
if(newValue =="Invalidate NOW!"){
ctrl.$setValidity('someClass', false);
} else if (oldValue == "Invalidate NOW!"){
angular.element(document.querySelector('.some-class')).remove();
} else {
ctrl.$setValidity('someClass', true);
}
}
scope.$watch("someValue", monitorField, true);
}
}
});
以下で動作します:
<FORM class="dir" ng-model="someValue">
<INPUT type="text" class="some-class" ng-model="someValue"/>
<INPUT type="text" class="some-other-class"/>
</FORM>
(はい、やや不自然な例です)。
問題はここで再現されます: http://jsfiddle.net/kTuAY/
私の実際のコードでは、オブジェクトの配列に基づいて入力フィールドにデータを入力します。これは Service を介して入力され、array.splice を介して要素を削除します。jsfiddle に示されている例は、単純にするためにあるだけです。
このフィドルには、別の興味深い失敗の状態が見られます。
具体的には、入力の 1 つが他のフィールドとの値の衝突がないことに依存しているため、無効化された後、他のフィールドの値が変更された場合、有効性は不正確なままになります。
仕事に行く間、一時的に機能しないフィドル:
ありがとう!