【问题标题】:Directive not called on input change输入更改未调用指令
【发布时间】:2016-04-01 08:41:27
【问题描述】:

我面临一个似乎无法解决的问题。 我有几个输入,每个指令都用于验证输入值,如下所示:

<div class="row form-group">
        <div class="col-sm-6">last name</div>
        <div class="col-sm-6">
            <div class="input-group" ng-class="{'has-error': form.lastname.$invalid && (form.lastname.$touched || form.$submitted)}">
                <input type="text" name="lastname" class="form-control"
                       model-blur
                       validator-lastname
                       ng-trim="true"
                       ng-model="fields.lastname.value"
                       ng-maxlength="fields.lastname.validation.maxLength">
                <input-group-addon class="input-group-addon"
                                       iga-char=""
                                       iga-form="form"
                                       iga-field="form.lastname"
                                       iga-if-touched="true">
                </input-group-addon> 
            </div>

            <form-message-list fml-form="form"
                                   fml-field="form.lastname"
                                   fml-label="Last name"
                                   fml-fieldData="fields.lastname">
            </form-message-list>
        </div>
    </div>

此字段需要以下模式:/^[\'a-zA-Z_]+( [\'a-zA-Z_]+)*$/

我的问题是: 当我在输入中添加无效值时,例如: / ,我的无效消息仍然存在,并且 ng-invalid-pattern 仍然在我的字段中。

当我像这样将此模式添加到我的字段时:ng-pattern="/^[\'a-zA-Z_]+( [\'a-zA-Z_]+)*$/" 我没有任何问题。但是当我尝试通过我的指令 validator-lastname 进行验证时,它只检查一次。当我用无效值填充输入然后将其更改为允许的空时,ng-invalid-pattern 错误仍然存​​在。

这是我的指令:

angular.module('app')
    .directive('validatorLastname', validatorLastname);

/* @ngInject */
function validatorLastname() {

    var directive = {
        require: 'ngModel',
        link: link
    };

    return directive;

    function link(scope, element, attrs, modelCtrl) {

        var valid = false;

        var formatter = function (inputValue) {
            if (inputValue) {
                var res = inputValue.match(/^[\'a-zA-Z_]+( [\'a-zA-Z_]+)*$/);
                if (res && res.length > 0) {
                    valid = true;
                }

                modelCtrl.$setValidity('pattern', valid);
                valid = false;
            }
            return inputValue;
        };
        modelCtrl.$parsers.push(formatter);
        if (scope[attrs.ngModel] && scope[attrs.ngModel] !== '') {
            formatter(scope[attrs.ngModel]);
        }
    }
}

我做了一个 JSFiddle 来重现这个问题:http://jsfiddle.net/sZZEt/537/

我希望有人能指出我正确的方向。 提前致谢。

【问题讨论】:

  • 您不需要将元素绑定到 onChange 事件(如果您想验证每次击键)或 onSubmit(表单,如果您只想在提交时验证)跨度>
  • 嗯,它确实会验证,但只有当我输入一个无效值然后删除该值时,错误对象才会更新。

标签: javascript angularjs angularjs-directive


【解决方案1】:

您应该更新指令代码以使一切正常。

angular.module('app')
.directive('validatorLastname', validatorLastname);

/* @ngInject */
function validatorLastname() {

    var directive = {
        require: 'ngModel',
        link: link
    };

    return directive;

    function link(scope, element, attrs, modelCtrl) {

        var valid = false;

        var formatter = function (inputValue) {
            if (inputValue) {
                var res = inputValue.match(/^[\'a-zA-Z_]+( [\'a-zA-Z_]+)*$/);
                if (res && res.length > 0) {
                    valid = true;
                }

                modelCtrl.$setValidity('pattern', valid);
                valid = false;
            }else{
                modelCtrl.$setValidity('pattern', true);  
            }
            return inputValue;
        };
        modelCtrl.$parsers.push(formatter);
        if (scope[attrs.ngModel] && scope[attrs.ngModel] !== '') {
            formatter(scope[attrs.ngModel]);
        }
    }
}

我为您的问题创建了一个plunk... 这是因为如果 inputValue 为 null 那么您的 $setValidity 方法将不会调用并且无法再次执行验证。您应该在 else 部分将模式有效性设置为 true。如果您想让字段对无输入有效。 您现在可以参考更新的 plunk https://plnkr.co/edit/N3DrsB?p=preview

【讨论】:

  • 在 Punkr 中,如果您输入无效值然后删除该值,则错误对象应该消失,因为该字段随后再次有效。我做了一个小提琴来重现我的问题:jsfiddle.net/sZZEt/537
  • 是的,所以我更新了 plunker 以了解您的问题。
  • 哦,它有效!如此简单,却如此感人!我猜我有一些星期五的忧郁。 ;-) 你能用 else 语句更新你的答案吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-17
  • 1970-01-01
  • 2019-08-02
  • 2016-10-02
  • 2017-06-03
  • 2017-12-14
相关资源
最近更新 更多