Javascript 从输入上的自定义指令如何使父窗体无效?
我已经做了一个自定义指令来进行输入验证,现在该指令在大多数情况下都可以正常工作,但我所做的方式是在使用Javascript 从输入上的自定义指令如何使父窗体无效?,javascript,angularjs,angularjs-directive,Javascript,Angularjs,Angularjs Directive,我已经做了一个自定义指令来进行输入验证,现在该指令在大多数情况下都可以正常工作,但我所做的方式是在使用ctrl.$setValidity('validation',false)检查字段之前使其无效然后我验证字段,如果它有效,则将它的$setValidity更改为true。但我的问题是,当我在指令中使用onBlur事件时,因为我一开始键入字段,它就会变脏并显示为无效,即使我只是希望它在onBlur之后无效,所以我发现最好是使表单无效,而不是使每个字段无效。 因此,为了简短起见,如何找到输入元素的父
ctrl.$setValidity('validation',false)检查字段之前使其无效
然后我验证字段,如果它有效,则将它的$setValidity
更改为true
。但我的问题是,当我在指令中使用onBlur
事件时,因为我一开始键入字段,它就会变脏并显示为无效,即使我只是希望它在onBlur
之后无效,所以我发现最好是使表单无效,而不是使每个字段无效。
因此,为了简短起见,如何找到输入元素的父表单并将其设置为无效?
当知道表单名称时,我知道我可以这样做
scope.myFormName.$setValidity('validation',false)代码>,它是有效的,但我试图成为泛型,自己找到表单对象,然后使其无效。我正在尝试循环使用elm.parent()
,但还没有太大的成功…我正在尝试使用jqLite尽可能保持通用性。
编辑
我有一些代码工作,但它不是完全干净的代码,有人有更好的方法吗
var j = 0;
var parentElm = elm.parent();
var parentFormElm = null;
do {
if(parentElm.prop('tagName').toUpperCase() === "FORM") {
parentFormElm = parentElm;
break;
}
parentElm = parentElm.parent(); // next parent
}while(parentElm !== "form" && j++ < 50);
scope[parentFormElm.prop('name')].$setValidity('validation', false);
var j=0;
var parentElm=elm.parent();
var parentFormElm=null;
做{
if(parentElm.prop(‘标记名’).toUpperCase()=“FORM”){
parentFormElm=parentElm;
打破
}
parentElm=parentElm.parent();//下一个父对象
}while(parentElm!=“form”&&j++<50);
范围[parentFormElm.prop('name')]。$setValidity('validation',false);
因为这只是一个样式化的问题(如评论中所指出的),所以您可以调整Angular的CSS类,这样输入字段只有在不聚焦时才会高亮显示:
.ng-invalid.ng-dirty:not(:focus) {
background-color: #ff7373;
}
如果您负担不起使用CSS3选择器,则需要两个CSS类:
.ng-invalid.ng-dirty {
background-color: #ff7373;
}
.ng-invalid.ng-dirty:focus {
background-color: #fff;
}
如果您只是想在触发onBlur
后使字段无效,为什么不在该事件发生时验证它呢?因为如果我不使表单无效,并且我使用的是onBlur
表单在我启动时显示为有效,并且我的提交按钮处于启用状态,这当然是错误的事实……因此,当用户开始键入时,您希望表单无效,但您只希望输入本身无效在它失去焦点后?不完全是这样,我宁愿让表单一开始就无效,而不使输入无效(因为它们仍然没有被触及)。如果只是样式化的问题(并且不需要IE8支持)我想每个可能的状态都可以有不同的CSS类:.ng invalid:focus
和.ng invalid:not(:focus)
。非常好,很好地了解了CSS3和备选方案。。再次感谢