禁用表单验证

时间:2013-02-01 17:45:28

标签: angularjs

Angularjs通过FormController运行我的表单(例如跟踪原始,脏等)。我不需要这个功能;我确定它会增加我的$digests费用。

如何关闭它?

5 个答案:

答案 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
    };
  });

显然,出于性能原因,你不会使用它,但是当你这样做时 需要动态启用或禁用验证。

示例:https://plnkr.co/edit/EM1tGb

答案 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