Angularjs
正在运行我的表单FormController
(例如跟踪原始、脏等)。我不需要这个功能;我确定这会增加我的$digests
.
我怎样才能关闭它?
AFAIK 没有简单的开关来关闭 AngularJS 验证。实际上大部分验证发生在NgModelController
和输入指令中——基本上是input.js 文件中的代码。因此,要摆脱内置验证,您必须从该文件重新开发代码(加上其他一些,如 select)。
您是否将验证代码确定为应用程序的性能瓶颈?
更新:这不起作用......至少不是你想要的方式。将 ng-non-bindable 添加到表单或任何输入都会中断所有绑定。因此,输入中的 ng-model 将不再起作用。对不起 ....
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/
在内部,Angular通过将Directive后缀添加到指令名称来从指令中创建工厂。因此,您可以用不可操作的工厂替换验证和输入指令工厂。
var noopDirective = function() { return function () {}; };
angular.module('myModule')
.factory('requiredDirective', noopDirective)
.factory('ngRequiredDirective', noopDirective)
.factory('inputDirective', noopDirective)
.factory('textareaDirective', noopDirective); // etc...
与@Chui Tey 之前的回答类似,有一个需要“ngModel”的指令。这是我在运行时禁用验证所做的:
//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
一位同事提出了一种禁用验证器的绝妙方法。这是一个实现:
<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
};
});
显然,出于性能原因,您不会使用它,而是当您需要动态启用或禁用验证时。