我ctrl.$setValidity
在我的一个指令中使用使表单无效。但是,有一种方法存在于其他地方,可以在不同的条件下从 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 中给出的示例只是为了简单起见。
在这个小提琴中可以看到另一个有趣的失败情况:
具体来说,如果其中一个输入依赖于值与另一个不冲突,因此无效,那么在更改其他字段值之后,有效性仍然不正确。
我上班时暂时不能正常工作的小提琴:
谢谢!