12

Angularjs正在运行我的表单FormController(例如跟踪原始、脏等)。我不需要这个功能;我确定这会增加我的$digests.

我怎样才能关闭它?

4

5 回答 5

9

AFAIK 没有简单的开关来关闭 AngularJS 验证。实际上大部分验证发生在NgModelController和输入指令中——基本上是input.js 文件中的代码。因此,要摆脱内置验证,您必须从该文件重新开发代码(加上其他一些,如 select)。

您是否将验证代码确定为应用程序的性能瓶颈?

于 2013-02-01T18:28:10.620 回答
9

更新:这不起作用......至少不是你想要的方式。将 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/

于 2013-10-15T17:22:06.380 回答
2

在内部,Angular通过将Directive后缀添加到指令名称来从指令中创建工厂。因此,您可以用不可操作的工厂替换验证和输入指令工厂。

var noopDirective = function() { return function () {}; };
angular.module('myModule')
    .factory('requiredDirective', noopDirective)
    .factory('ngRequiredDirective', noopDirective)
    .factory('inputDirective', noopDirective)
    .factory('textareaDirective', noopDirective); // etc...
于 2013-11-08T23:02:59.883 回答
2

与@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
于 2016-07-27T15:37:26.460 回答
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

于 2016-05-30T12:30:51.980 回答