Disabling form validation

后端 未结 5 1504
暗喜
暗喜 2020-12-20 13:32

Angularjs is running my forms through the FormController (eg tracking pristine, dirty, etc). I don\'t need this functionality; I\'m sure it\'s add

5条回答
  •  小蘑菇
    小蘑菇 (楼主)
    2020-12-20 14:11

    A colleague suggested a nifty way of disabling validators. Here's an implementation:

    Enabled
    Disabled
    
    
    

    When disable-validation is true, then all validation rules automatically passes.

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

    Obviously, you'd not use this for performance reasons, but when you need to dynamically enable or disable validations.

    Sample: https://plnkr.co/edit/EM1tGb

提交回复
热议问题