带有错误消息的自定义验证器的 angularjs 指令

Posted

技术标签:

【中文标题】带有错误消息的自定义验证器的 angularjs 指令【英文标题】:angularjs directive for custom validator with error messages 【发布时间】:2018-04-11 20:50:06 【问题描述】:

我希望能够将自定义验证器的字典以及可能的错误消息传递给 angular 指令,以便在相应的验证器返回 false 时呈现适当的错误消息。

这里有一些代码:

base.js:

function not_bob(value) 
  return value != "bob";


function not_alice(value) 
  return value != "alice";

app.js:

(function() 
    var app = angular.module("my_app");
    app.controller("MyController", [ "$scope", function($scope) 
        var my_controller = this;
        my_controller.person = 
          "first_name": "fred",
          "last_name": "jones"
        
        my_controller.validators = 
            "first_name" : [
                
                    "name": "validatebob",
                    "fn": not_bob,
                    "msg": "bob is not allowed"
                ,
                
                    "name": "validatealice",
                    "fn": not_alice,
                    "msg": "alice is not allowed"
                
            ]
        ;

    ]);
    app.directive('myvalidators', ['$compile', function($compile) 
        return 
            require: ['^form', 'ngModel'],
            scope: 
                validators: '=myvalidators'
            ,
            link: function(scope, elm, attrs, ctrls) 
                var form = ctrls[0];
                var ctrl = ctrls[1];
                var parent = elm.parent();
                $.each(scope.validators, function(i, validator) 
                    ctrl.$validators[validator.name] = function(modelValue, viewValue) 
                        return validator.fn(viewValue);
                    ;
                    var error_class = [form.$name, ctrl.$name, "$error", validator.name].join(".");
                    var error_content = "<div ng-show='" + error_class + "'>" + validator.msg + "</div>"
                    var compiled_error_content = $compile(error_content)(scope)
                    parent.append(compiled_error_content);
                );
            
        ;
    ]);
)();

template.html:

  <html>
      <script type="text/javascript" src="base.js"></script>
      <script type="text/javascript" src="app.js"></script>
      <div ng-app="my_app">
        <div ng-controller="MyController as my_controller">
          <form name="person_form" novalidate>
            <input type="text" class="form-control" name="first_name" id="id_first_name" ng-model="my_controller.person.first_name" myvalidators="my_controller.validators['first_name']">
          </form>
        </div> 
      </div>
    </html>

这看起来很复杂(这是一个人为的例子),但它主要是有效的;我将一个数组作为参数传递给指令。数组的每个元素都是一个 JSON 对象,带有一个“名称”告诉我验证器的名称,一个“fn”告诉我要运行什么函数来执行验证,一个“msg”告诉我如果该函数显示什么返回假。

果然,当我键入“bob”或“alice”时,该指令导致输入无效,并添加了以下兄弟元素:

<div ng-show="person_form.first_name.$error.validatebob">bob is not allowed</div>
<div ng-show="person_form.first_name.$error.validatealice">alice is not allowed</div>

但是,那些元素从不出现。

有趣的是,如果我只是手动将这些元素添加到模板中(即:不使用指令),那么当相应的验证器返回 false 时会出现正确的消息。

关于我做错了什么有什么想法吗?

谢谢


编辑:我很确定这是与范围有关的事情;也许控制器中的“person_form”对象在指令中不可用?

【问题讨论】:

【参考方案1】:

啊哈!正如怀疑的那样,问题出在范围上。

表单在我的控制器范围内,而不是在我的指令的隔离范围内。从这里更改指令中的行:

var compiled_error_content = $compile(error_content)(scope)

到这里:

var compiled_error_content = $compile(error_content)(scope.$parent)

成功了。

【讨论】:

以上是关于带有错误消息的自定义验证器的 angularjs 指令的主要内容,如果未能解决你的问题,请参考以下文章

带有 HTTPStatusCodeResult 和 jQuery 的自定义错误消息

带有错误代码和错误消息的自定义 Python 异常

如何根据 Angular 2 中的自定义验证规则显示错误消息?

Laravel 验证规则的自定义错误消息:维度

通过使用 AngularJS 的自定义登录进行 Spring Security 身份验证

Laravel 中正则表达式规则的自定义验证消息?