【问题标题】:jquery validation engine's conditional validationjquery验证引擎的条件验证
【发布时间】:2015-06-09 18:08:12
【问题描述】:

我有一个使用 Jquery 验证引擎作为内部验证库和 Angular SPA 的表单。该表单有一个复选框和一个文本框。我希望仅在选中复选框时才需要该文本框。此功能似乎正在工作。但问题是即使存在验证错误,我的 ng-submit 函数也会被调用。我想限制这个调用。我正在使用 Angular 的指令来验证和使控件无效。

            <form role="form" name="frmVariableConfig1" class="formValidVariableConfig1 form-inline" novalidate ng-submit="frmVariableConfig1.$valid && vm.saveChanges()">


                        <span class="checkableBox"><input type="checkbox" item="variable" toggle-selection="toggleSelection('1')" bootstrap-check ng-model="vm.SetThreshold"></span>


            <input type="text" ng-model="vm.Threshold" name="cntrlThresh" class="form-control input-sm {{ vm.getValidation(vm.SetThreshold) }}" placeholder="Threshold" check-validation2>

                  <button type="submit" class="btn btn-sm">Save</button>
        </form>   

vm.getValidation 函数根据上面复选框的模型 vm.SetThreshold 的值返回“validate[required]”或“”。

指令是这样设置的

    .module('app').directive('checkValidation2', [
    function () {
        return {
            restrict: 'A',
            require: '?ngModel',
            link: function (scope, element, attrs, ngModel) {
                element.closest('form').validationEngine();

                scope.$watch(attrs.ngModel, function (newValue, oldValue) {
                    var valid = !element.validationEngine('validate');//check if the control is valid
                    ngModel.$setValidity(element.context.name, valid); //set validity accordingly. 
                    return valid;
                });
            }
        };
    }
]);

更新

这里有些东西可能会有所帮助。在页面加载时,表单是 ng 有效的。很好,因为文本框中没有注入验证。现在我单击复选框,它在文本框中注入验证类,但表单保持不变。即它仍然是 ng 有效的。所以现在如果我单击按钮导致表单有效,则调用该函数。

如果我只是在没有函数调用的情况下添加验证类,则表单在页面加载时无效,并且如果文本框已填充则有效。这是预期的行为。

看起来一切都在发生,因为我正在动态注入验证。一些表单验证需要在注入后重新启动。

checkBox 正在使用带有指令的 iCheck 插件

angular.module('app').directive('checkValidation2', ['$compile',
function($compile) {
    return {
        restrict: 'A',
        require: '?ngModel',
        compile: function(ele, attr, ngModel) {
            ele.closest('form').validationEngine();
            //removing directive attribute to stop to go it to infinite loop
            //as we are compiling DOM again

            ele.removeAttr("check-Validation2");
            var compile = $compile(ele); //compiling object on prelink state
            return function(scope, element, attrs, ngModel) {
                compile(scope); //compiling dom in postlink phase
                scope.$watch(attrs.ngModel, function(newValue, oldValue) {
                    var valid = !element.validationEngine('validate'); //check if the control is valid
                    ngModel.$setValidity(element.context.name, valid); //set validity accordingly. 
                    return valid;
                });
            }

        }
    };
}

]);

【问题讨论】:

    标签: javascript angularjs angularjs-directive jquery-validation-engine


    【解决方案1】:

    当您使用 controllerAs 语法时,您的值不在范围内,您需要将该值绑定到范围内

    $scope.$watch(angular.bind(this, function () {
        return this[attrs.ngModel]; // this will evaluate ng-model value from `this`
    }), function (newVal, oldVal) {
         var valid = !element.validationEngine('validate');//check if the control is valid
         ngModel.$setValidity(element.context.name, valid); //set validity accordingly. 
         return valid;
    });
    

    更新

    您应该尝试在指令的编译阶段注入表单validationEngine,以便更改准确地发生在DOM中,

    指令

    .module('app').directive('checkValidation2', [
        function() {
            return {
                restrict: 'A',
                require: '?ngModel',
                compile: function(ele, attr, ngModel) {
                    ele.closest('form').validationEngine();
                    //removing directive attribute to stop to go it to infinite loop
                    //as we are compiling DOM again
                    ele.removeAttr('checkValidation2');
                    var compile = $compile(ele); //compiling object on prelink state
                    return function(scope, element, attrs, ngModel) {
                        compile(scope); //compiling dom in postlink phase
                        scope.$watch(attrs.ngModel, function(newValue, oldValue) {
                            var valid = !element.validationEngine('validate'); //check if the control is valid
                            ngModel.$setValidity(element.context.name, valid); //set validity accordingly. 
                            return valid;
                        });
                    }
    
                }
            };
        }
    ]);
    

    【讨论】:

    • 是的,它的语法。将在一分钟内测试它
    • 我明白你的意思,但结果是一样的。验证确实像以前一样被应用,但它仍然调用我的函数意味着表单保持 ng-valid 但是如果我不从函数 vm.getValidation 注入验证类,它会按预期工作。
    • @RaasMasood 您的手表是否返回了正确的价值?有效性设置正确吗?\
    • 我得到超过最大调用堆栈大小
    • 你需要在编译elenent之前删除指令元素..似乎目前它指令元素无限并且抛出最大调用堆栈超过错误
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多