簡體   English   中英

ng-messages的Angular 1.5自定義驗證指令

[英]Angular 1.5 custom validation directive for ng-messages

我正在處理ng-messages的自定義指令,在其中向輸入字段添加一個指令“ custom-validation”:

 <input name="inputName" ng-model="vm.inputName" custom-validation="vm.validationConfig" class="form-control" />

並使用配置定義對象:

    vm.validationConfig = {
        "rules": [
            { "ng-minlength": 2 },
            { "ng-maxlength": 20 },
            { "ng-pattern": "/^[a-zA-Z0-9]$/" },
            "required"
        ],
        "messages": [
            { "required": "This field is required" },
            { "minlength": "Message must be over 2 characters" },
            { "maxlength": "Message must not exceed 20 characters" },
            { "pattern": "Message must contain letters or numbers only" }
        ]
    };

添加指令輸入后,應將其簡單包裝如下:

   <form name="inputName-form" ng-class="{ 'has-error':  inputName-form.inputName.$invalid }" novalidate>
        <input name="inputName" type="number" ng-model="inputName" max="100" class="form-control" required>
        <div ng-messages="inputName-form.inputName.$error" class="error-messages" role="alert"  ng-if="inputName-form.inputName.$invalid ">
            <div ng-message="number" class="message">Should be a number</div>
            <div ng-message="max" class="message">The number is too large.</div>
            <div ng-message="required" class="message">The field is required.</div>
        </div>
    </form>

到目前為止,我的指令如下所示:

(function () {
    "use strict";
    var module = angular.module('app');

    function isObject(obj) {
        return obj === Object(obj);
    }
    var validate = function () {
        return {
            restrict: 'A',
            replace: true,
            transclude: "element",
            scope: {
            },
            link: function (scope, element, attrs) {
                var input = attrs.name;
                //for some reason there was a space with the name
                input = input.split(' ').join('');
                scope.inputName = input;
                //create a unique form name
                scope.formName = input + "-form";
                //remove doubled form control
                element.removeClass('form-control');
                //get configuration
                scope.config = scope.$parent.vm.validationConfig;
                //object to set if form is valid or not
                scope.isValid = scope.$parent.vm.formValid;
                var formInputId = scope.formName + "." + scope.inputName;
                scope.$watch('scope.formName.$valid', function (newVal) {
                    scope.isValid[formInputId] = newVal;
                });
                var i, obj, key, val;
                scope.input = scope[attrs.name];
                //parse configuration object
                if (scope.config !== undefined) {
                    for (i = 0; i < scope.config.rules.length; i++) {
                        if (isObject(scope.config.rules[i])) {
                            obj = scope.config.rules[i];
                            key = Object.keys(obj)[0];
                            val = obj[key];
                            attrs.$set(key, val);
                        } else {
                            attrs.$set(scope.config.rules[i], true);
                        }
                    }
                    //parse messages
                    scope.msg = '';
                    for (i = 0; i < scope.config.messages.length; i++) {
                        obj = scope.config.messages[i];
                        key = Object.keys(obj)[0];
                        val = obj[key];
                        var newMessage = '<div ng-message=' + key + '>' + val + '</div>';
                        scope.msg = scope.msg.concat(newMessage);
                    }
                }
            },
            template: '<form name="{{formName}}"><div ng-transclude></div><div ng-messages="formName[inputName].$error">{{msg}}</div></form>'
        };
    };
    module.directive('customValidation', validate);
}());

將此指令實現為模板至少有兩個問題

<div ng-messages="formName[inputName].$error">{{msg}}</div>
  1. 我不知道如何正確訪問formName.inputName。$ error?
  2. {{msg}}正在將所有的ng-messages視作一個字符串,我之前曾嘗試對其進行編譯,但是它沒有用...

謝謝

最后,我用下面的代碼解決了這個問題。

(function () {
    "use strict";
    var module = angular.module('app');
    function isObject(obj) {
        return obj === Object(obj);
    }
    var validate = function ($compile) {
        return {
            restrict: 'A',
            scope: {},
            link: function (scope, element, attrs) {
                scope.formName = attrs.name + "Form";
                scope.ngMsgs = scope.formName + "." + attrs.name + ".$error";
                scope.config = scope.$parent.vm.validationConfig;
                var i, obj, key, val;
                if (scope.config !== undefined) {
                    for (i = 0; i < scope.config.rules.length; i++) {
                        if (isObject(scope.config.rules[i])) {
                            obj = scope.config.rules[i];
                            key = Object.keys(obj)[0];
                            val = obj[key];
                            attrs.$set(key, val);
                        } else {
                            attrs.$set(scope.config.rules[i], true);
                        }
                    }
                    scope.msg = '';
                    for (i = 0; i < scope.config.messages.length; i++) {
                        obj = scope.config.messages[i];
                        key = Object.keys(obj)[0];
                        val = obj[key];
                        var newMessage = '<div ng-message=' + key + '>' + val + '</div>';
                        scope.msg = scope.msg.concat(newMessage);
                    }
                }
                var wrapper = angular.element
                    (
                    '<form name=' + scope.formName + ' ng-class="{ ' + "'has-error'" + ':  ' + scope.formName + '.' + attrs.name + '.$invalid }" novalidate>'
                    );
                element.after(wrapper);
                element.removeAttr("custom-validation");
                wrapper.append(element);
                wrapper.append("<div ng-messages=" + scope.ngMsgs + " class='error-messages' role='alert' ng-if='" + scope.formName + '.' + attrs.name + ".$invalid'>" + scope.msg + "</div>");
                $compile(wrapper)(scope);
            }
        };
    };
    module.directive('customValidation', validate);
}());

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM