12

Angularjs私のフォームを実行していますFormController(たとえば、元の状態の追跡、汚れた追跡など)。この機能は必要ありません。私のにオーバーヘッドが追加されていると確信してい$digestsます。

どうすればそれを止めることができますか?

4

5 に答える 5

9

AFAIKには、AngularJS検証をオフにする簡単なスイッチはありません。実際、検証のほとんどは、NgModelControllerおよびinputディレクティブで行われます。基本的には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は、ディレクティブ名にディレクティブサフィックスを追加することにより、ディレクティブからファクトリを作成します。したがって、検証ファクトリと入力ディレクティブファクトリを動作しないファクトリに置き換えることができます。

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

同僚は、バリデーターを無効にする気の利いた方法を提案しました。実装は次のとおりです。

<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" />

trueの場合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 に答える
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 に答える