由浅入深剖析Angular表单验证(3)

-->每次脏检测都会判断name的值是否跟$ngModel.$modelValue不一致(这里是使用$watch实现的),不一致就反序遍历$formaters里面的所有函数并执行,把最终返回值赋值到$ngModel.$viewValue

-->刷新输入框内容

“自定义输入框的显示内容”的例子能不能优化?

为什么要优化?

原因很简单,为了实现“自定义内容”,使用了$parsers和$formatters,其实两者的内容很像!这一点很关键。

怎么优化?

使用$ngModel.$validators。

好,现在把例子再改一下。

.directive("upperCase",function(){ return { restrict:"A", require:"ngModel", link:function($scope,$element,$attrs,$ngModel){ //1.3才支持,不管手动输入还是通过其他地方更新modelValue,都会执行这里 $ngModel.$validators.uppercase = function(modelValue,viewValue){ var viewValue = upperCaseFirstWord(handleEmptyValue(modelValue)); //设置界面内容 $ngModel.$setViewValue(viewValue); //渲染到界面上,这个函数很重要 $ngModel.$render(); //返回true,表示验证通过,在这里是没啥意义 return true; } //防止undefined,把所有的内容转换成字符串 function handleEmptyValue(value){ return angular.isUndefined(value) ? "" : "" + value; } //首字母大写 function upperCaseFirstWord(value){ return value.length > 0 ? value[0].toUpperCase() + value.substring(1) : ""; } } } })

代码简洁了很多,$ngModel.$validators在1.3以上的版本才支持。

$ngModel.$validators.uppercase函数的返回值如果是false,那么$ngModel.$error['uppercase']=true。这一点跟$ngModel.$setValidity("uppercase",false)差不多。

您可能感兴趣的文章:

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wzswxp.html