我创建了一个自定义angularjs指令,只有在输入元素上模糊后才需要执行特定的验证。但问题是即使在onkeypress事件之后也会发生验证。 虽然,它第一次正确地发生在模糊上,从第二次开始,它甚至发生在onkeypress上。
整个工作样本都在下面。请自行检查并随时编辑和试用。我不确定出了什么问题。我需要customValidator()函数才能在模糊完成后执行。
angular.module('app').directive('strongSecret', function () {
return {
restrict: 'A',
require: 'ngModel',
link: function (scope, element, attr, ctrl) {
element.bind('blur', function customValidator() {
scope.$apply(attr.strongSecret);
scope.$watch(attr.ngModel, function(value) {}
fiddle Entire Working Sample code
感谢任何帮助!
答案 0 :(得分:0)
它在onkeypress事件之后发生的原因是因为该函数在模型控制器中被设置为$解析器。 解析器的角度文档:
每当控件从DOM读取值时,作为管道执行的函数数组。函数按数组顺序调用,每个函数都将返回值传递给下一个。最后一个返回值将转发到$ validators集合。解析器用于清理/转换$ viewValue
我认为这就是为什么每次按键都会调用你的函数的原因,解析器会在每次按键时触发。
你也将它绑定到onBlur上,我无法弄明白为什么它只是第一次模糊时才会这样做。
执行此操作的正确方法是将其拆分为三个返回true或false的函数(每个验证规则一个)并指定为$ validators而不是$ parsers。您甚至不需要将功能分配给on blur事件,您只需使用ng-model-options传递updateOn blur选项(https://docs.angularjs.org/guide/forms查看自定义模型触发器)。这将使您的验证器仅在模糊时触发,而不是每按一次按键。