Angularjs
私のフォームを実行していますFormController
(たとえば、元の状態の追跡、汚れた追跡など)。この機能は必要ありません。私のにオーバーヘッドが追加されていると確信してい$digests
ます。
どうすればそれを止めることができますか?
Angularjs
私のフォームを実行していますFormController
(たとえば、元の状態の追跡、汚れた追跡など)。この機能は必要ありません。私のにオーバーヘッドが追加されていると確信してい$digests
ます。
どうすればそれを止めることができますか?
AFAIKには、AngularJS検証をオフにする簡単なスイッチはありません。実際、検証のほとんどは、NgModelController
およびinputディレクティブで行われます。基本的には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は、ディレクティブ名にディレクティブサフィックスを追加することにより、ディレクティブからファクトリを作成します。したがって、検証ファクトリと入力ディレクティブファクトリを動作しないファクトリに置き換えることができます。
var noopDirective = function() { return function () {}; };
angular.module('myModule')
.factory('requiredDirective', noopDirective)
.factory('ngRequiredDirective', noopDirective)
.factory('inputDirective', noopDirective)
.factory('textareaDirective', noopDirective); // etc...
同僚は、バリデーターを無効にする気の利いた方法を提案しました。実装は次のとおりです。
<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
};
});
明らかに、パフォーマンス上の理由からこれを使用することはありませんが、検証を動的に有効または無効にする必要がある場合に使用します。
@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