【发布时间】: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