Angularjs
通过FormController
运行我的表单(例如跟踪原始,脏等)。我不需要这个功能;我确定它会增加我的$digests
费用。
如何关闭它?
答案 0 :(得分:9)
AFAIK没有简单的开关来关闭AngularJS验证。实际上,大多数验证都发生在NgModelController
和输入指令中 - 基本上是input.js file中的代码。因此,要摆脱内置验证,您必须从该文件中重新开发代码(以及其他一些代码,例如select)。
您是否将验证码识别为应用程序中的性能瓶颈?
答案 1 :(得分:9)
更新:这不起作用......至少不是你喜欢的方式。将ng-non-bindable添加到表单或任何输入会中断ALL绑定。因此,输入中的ng模型将不再起作用。对不起....
ng-non-bindable是解决这个问题的方法。
它将阻止AngularJS将表单视为指令。这将使AngularJS忽略整个表单:
<form name="inviteContactForm" ng-non-bindable>
这将使AngularJS忽略表单的一部分:
<input type="email" name="email" ng-non-bindable>
你可以在这里读一下我对这个问题的抱怨。 http://calendee.com/preventing-angularjs-from-hijacking-forms/
答案 2 :(得分:2)
内部Angular通过在指令名称中添加指令后缀,从指令中创建工厂。因此,您可以将验证和输入指令工厂替换为无操作的工厂。
var noopDirective = function() { return function () {}; };
angular.module('myModule')
.factory('requiredDirective', noopDirective)
.factory('ngRequiredDirective', noopDirective)
.factory('inputDirective', noopDirective)
.factory('textareaDirective', noopDirective); // etc...
答案 3 :(得分:2)
一位同事提出了一种禁用验证器的方法。这是一个实现:
<input type="radio" name="enableValidation" ng-model="$ctrl.validationEnabled" ng-value="true" />Enabled
<input type="radio" name="enableValidation" ng-model="$ctrl.validationEnabled" ng-value="false" />Disabled
<input type="number"
name="age"
ng-model="$ctrl.age"
min="20"
disable-validation="!$ctrl.validationEnabled" />
当disable-validation
为真时,所有验证规则都会自动通过。
function disableValidation(scope, elem, attrs, ngModelController) {
function wrapOriginalValidators() {
var originalValidators = angular.copy(ngModelController.$validators);
Object.keys(originalValidators).forEach(function(key) {
ngModelController.$validators[key] = function(modelValue, viewValue) {
return scope.$eval(attrs.disableValidation) || originalValidators[key](modelValue, viewValue);
}
});
}
function watchDisableCriteria() {
scope.$watch(attrs.disableValidation, function() {
// trigger validation
var originalViewValue = ngModelController.$viewValue;
scope.$applyAsync(function() {
ngModelController.$setViewValue('');
});
scope.$applyAsync(function() {
ngModelController.$setViewValue(originalViewValue);
});
});
}
wrapOriginalValidators();
watchDisableCriteria();
}
angular.module('app', [])
.directive('disableValidation', function() {
return {
require: 'ngModel',
link: disableValidation
};
});
显然,出于性能原因,你不会使用它,但是当你这样做时 需要动态启用或禁用验证。
答案 4 :(得分:2)
与之前的@Chui Tey的回答类似,有一个需要&#ng; ngModel&#39;的指令。这就是我做的 用于在运行时禁用验证:
//disabling all validators
forEach(ngModelController.$validators, function(validator, validatorName){
ngModelController.$setValidity(validatorName, true);//mark invalid as valid
var originalValidator = ngModelController.$validators[validatorName]; //we save the original validator for being able to restore it in future
ngModelController.$validators[validatorName] = _.wrap(true);//overwrite the validator
ngModelController.$validators[validatorName].originalValidator = originalValidator;
});
//for restoring validations
forEach(ngModelController.$validators, function(validator, validatorName){
if(ngModelController.$validators[validatorName].originalValidator){
ngModelController.$validators[validatorName] = ngModelController.$validators[validatorName].originalValidator;
}
});
ngModelController.$validate(); //triger validations