来自AngularJS Custom Directive的射击模糊事件

时间:2016-05-05 18:58:11

标签: angularjs angularjs-directive

我创建了一个自定义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

感谢任何帮助!

1 个答案:

答案 0 :(得分:0)

它在onkeypress事件之后发生的原因是因为该函数在模型控制器中被设置为$解析器。 解析器的角度文档:

  

每当控件从DOM读取值时,作为管道执行的函数数组。函数按数组顺序调用,每个函数都将返回值传递给下一个。最后一个返回值将转发到$ validators集合。解析器用于清理/转换$ viewValue

我认为这就是为什么每次按键都会调用你的函数的原因,解析器会在每次按键时触发。

你也将它绑定到onBlur上,我无法弄明白为什么它只是第一次模糊时才会这样做。

执行此操作的正确方法是将其拆分为三个返回true或false的函数(每个验证规则一个)并指定为$ validators而不是$ parsers。您甚至不需要将功能分配给on blur事件,您只需使用ng-model-options传递updateOn blur选项(https://docs.angularjs.org/guide/forms查看自定义模型触发器)。这将使您的验证器仅在模糊时触发,而不是每按一次按键。