13フォーム検証
15485 ワード
フォーム検証
組み込みフォーム検証命令
Angularは、(text,number,url,email,radio,checkbox)、および検証のための命令(required,pattern,minlength,maxlength,min,max)のいくつかの一般的なhtml 5入力コントロールの検証実装を提供します.ここでは、パターンマッチング
注意:HTMLフォームのプロパティnovalidateを使用して、ブラウザのデフォルトの検証を無効にします.
フォームのプロパティ
ツールバーの
説明
対応するCSSスタイル
$dirty
フォームに記入記録があります
.ng-dirty {}
$valid
フィールドの内容
.ng-valid {}
$invalid
フィールドの内容が不正です
.ng-invalid {}
$pristine
フォームに記録が記入されていません
.ng-pristine {}
$error
現在のフォームのすべての検証内容と、それらが合法かどうかの情報.検証に失敗した場合、この属性の値はtrueです.値がfalseの場合、入力フィールドの値が検証されたことを示します.
ngModel.NgModelController
1つのフォームは、
ngModel.NgModelControllerはng-model命令にAPIを提供した.このコントローラには、データバインディング、検証、CSS更新サービス、および値のフォーマットおよび解析が含まれます.論理処理、DOMレンダリング、またはリスニングイベントは含まれていません.このようなDOMに関連する論理は、他のNgModelControllerを用いたデータバインド命令によって提供されるべきである.
方法
$render();
ビューを更新する必要がある場合に呼び出されます.
$isEmpty(value);
inputの値が空であるかどうかを判断する必要がある場合に実行できます.たとえば、inputの値が存在するかどうかは、必要なコマンドがこの関数を実行します.デフォルトの$isEmpty関数は、値がundefined、null、またはNaNであるかどうかを確認します.
Value:参照を確認します.
$setValidity(validationErrorKey,isValid);
有効性のステータスを変更し、フォームの現在のコントローラの有効性が変化したことを通知します.(ベリファイアが無効とマークされている場合は、フォームに通知しません.)
このメソッドは、検証が必要な場合に呼び出されます.すなわち、アナライザまたはフォーマット機能です.
validationErrorKey:ベリファイアの名前.validationErrorKeyは$error[validationErrorKey]=isValidに割り当てられ、データバインドが可能になります.
isValid:現在のステータスがvalid(true)またはinvalid(false)かどうか.
$setPristine();
コントローラの初期化状態を設定します.
$setViewValue(value);
ページの値を更新します.
ページの値が変化すると、このメソッドが呼び出されます.
value:ページの値.
属性:
$viewValue
ページ上の実際の文字列値.
$modelValue
モデル内のコントローラにバインドされている値.
$parsers
実行される機能配列は,コントローラとしてDOMから値を読み出すパイプである.各関数は次の関数に値を渡すように呼び出され、最後にモデルを埋め込むために値を返します.値の浄化/変換または検証に使用します.検証のために、解析器は$setvalidity()を使用して有効な状態を更新し、定義されていない無効な値を返す必要があります.
$formatters
実行される機能の配列は、コントローラとしてDOMから値を読み出すパイプです.各関数は次の関数に値を渡すように呼び出され、最後にモデルを埋め込むために値を返します.コントローラと認証に表示される値をフォーマット/変換します.
$viewChangeListeners
ページの値が変化すると実行される関数の配列.パラメータは実行されず、戻り値は無視されます.これは、モデル値の追加のリスニングの代わりに使用できます.
$error
すべてのエラーを持つhashオブジェクト.
$pristine
ユーザーがコントローラと対話していない場合はtrueです.
$dirty
ユーザーがコントローラと対話している場合はtrueです.
$valid
エラーがなければtrueです.
$invalid
コントローラに少なくとも1つのエラーがある場合はtrueです.
カスタム認証
フォームの検証は2つのタイミングでトリガーされます.データのビューへの更新-制約されたモデルが変更されると、 は、データの更新を表示する-同様に、ユーザがコントロールと対話するときに
$parsers
各
$formatters
バインドされたngModel値が変化し、
これらの関数は、単純な検証目的よりも、ビュー内の視覚的な変化を処理するためによく使用されます.たとえば、値をフォーマットするとします.この値には、
カスタムformコントロール('ngModel'を使用)
カスタムコントロールを「ngModel」と正常に動作させ、双方向バインドの効果を達成するには、次の必要があります.は、方法 は、
値が解析され、
最後に、すべてのステップが完了すると、
なお、
この命令は、役割ドメインを分離していないことに注意してください.このコマンドに独立した役割ドメインを設定すると、内部ngModelは外部ngModelの対応する値を更新できません.AngularJSはローカル役割ドメイン以外で値をクエリーします.
ngMessages
フォームを検証してデータを記入する場合、データが間違っているか無効である場合にヒント情報が表示され、angularでフォームを書く場合、ヒント情報は
angular-messagesはangularのモジュールであり、アプリケーション依存モジュールとして導入することができます.
これにより、フォームデータの入力に誤りがあると、メッセージが1回に1つしか表示されず、コード内の順序が表示され、すべてのエラーを同時に表示する必要がある場合は、
あるいは、ビュー内の複数の場所で同じプロンプトメッセージを呼び出す必要がある場合が多い場合、次のようにメッセージをテンプレートに保存できます.
方法1
方法2
組み込みフォーム検証命令
Angularは、(text,number,url,email,radio,checkbox)、および検証のための命令(required,pattern,minlength,maxlength,min,max)のいくつかの一般的なhtml 5入力コントロールの検証実装を提供します.ここでは、パターンマッチング
ng-pattern
命令のみを説明する.ng-pattern="/PATTERN/"
を使用して、指定した正規表現に一致するように入力します.
注意:HTMLフォームのプロパティnovalidateを使用して、ブラウザのデフォルトの検証を無効にします.
フォームのプロパティ
ツールバーの
説明
対応するCSSスタイル
$dirty
フォームに記入記録があります
.ng-dirty {}
$valid
フィールドの内容
.ng-valid {}
$invalid
フィールドの内容が不正です
.ng-invalid {}
$pristine
フォームに記録が記入されていません
.ng-pristine {}
$error
現在のフォームのすべての検証内容と、それらが合法かどうかの情報.検証に失敗した場合、この属性の値はtrueです.値がfalseの場合、入力フィールドの値が検証されたことを示します.
formName.inputFieldName.property
を使用して入力ボックスの内容を検証するか、formName.property
を使用してフォーム全体のすべての入力ボックスの内容を検証できます.ngModel.NgModelController
1つのフォームは、
FormController
のインスタンスです.api/ng.directive:ngModel
命令を有する入力制御であって、NgModelController
例を含む.ngModel.NgModelControllerはng-model命令にAPIを提供した.このコントローラには、データバインディング、検証、CSS更新サービス、および値のフォーマットおよび解析が含まれます.論理処理、DOMレンダリング、またはリスニングイベントは含まれていません.このようなDOMに関連する論理は、他のNgModelControllerを用いたデータバインド命令によって提供されるべきである.
方法
$render();
ビューを更新する必要がある場合に呼び出されます.
$isEmpty(value);
inputの値が空であるかどうかを判断する必要がある場合に実行できます.たとえば、inputの値が存在するかどうかは、必要なコマンドがこの関数を実行します.デフォルトの$isEmpty関数は、値がundefined、null、またはNaNであるかどうかを確認します.
Value:参照を確認します.
$setValidity(validationErrorKey,isValid);
有効性のステータスを変更し、フォームの現在のコントローラの有効性が変化したことを通知します.(ベリファイアが無効とマークされている場合は、フォームに通知しません.)
このメソッドは、検証が必要な場合に呼び出されます.すなわち、アナライザまたはフォーマット機能です.
validationErrorKey:ベリファイアの名前.validationErrorKeyは$error[validationErrorKey]=isValidに割り当てられ、データバインドが可能になります.
isValid:現在のステータスがvalid(true)またはinvalid(false)かどうか.
$setPristine();
コントローラの初期化状態を設定します.
$setViewValue(value);
ページの値を更新します.
ページの値が変化すると、このメソッドが呼び出されます.
value:ページの値.
属性:
$viewValue
ページ上の実際の文字列値.
$modelValue
モデル内のコントローラにバインドされている値.
$modelValue
はデータモデルによって保持される.$modelValue
および$viewValue
は、$parser
のパイプラインが動作しているかどうかによって異なる場合があります.$parsers
実行される機能配列は,コントローラとしてDOMから値を読み出すパイプである.各関数は次の関数に値を渡すように呼び出され、最後にモデルを埋め込むために値を返します.値の浄化/変換または検証に使用します.検証のために、解析器は$setvalidity()を使用して有効な状態を更新し、定義されていない無効な値を返す必要があります.
$formatters
実行される機能の配列は、コントローラとしてDOMから値を読み出すパイプです.各関数は次の関数に値を渡すように呼び出され、最後にモデルを埋め込むために値を返します.コントローラと認証に表示される値をフォーマット/変換します.
$viewChangeListeners
ページの値が変化すると実行される関数の配列.パラメータは実行されず、戻り値は無視されます.これは、モデル値の追加のリスニングの代わりに使用できます.
$error
すべてのエラーを持つhashオブジェクト.
$pristine
ユーザーがコントローラと対話していない場合はtrueです.
$dirty
ユーザーがコントローラと対話している場合はtrueです.
$valid
エラーがなければtrueです.
$invalid
コントローラに少なくとも1つのエラーがある場合はtrueです.
カスタム認証
フォームの検証は2つのタイミングでトリガーされます.
NgModelController#$formatters
配列内のすべてのメソッドがパイプ式に呼び出されます(すなわち、次から次へと呼び出されます).これにより、すべてのメソッドが値をフォーマットしてフォームとコントロールの有効性状態を変更する機会があり、NgModelController#$setValidity
を呼び出すことで実現されます.NgModelController#$setViewValue
を呼び出す.これはまた、NgModelController#$parsers
配列中のすべてのメソッドを逆管式で呼び出し、これにより、すべてのメソッドが値を変換してフォームとコントロールの有効性状態を変更する機会があり、NgModelController#$setValidity
によって実現される.$parsers
$parsers
配列を使用することは、カスタム検証を実現する方法の1つです.たとえば、入力値が2つの数値の間にあることを確認したい場合、$parsers
配列に新しい関数をスタックすることができ、この関数は検証チェーンで呼び出されます.各
$parser
が返す値は、次の$parser
に入力されます.データモデルの更新が望ましくない場合はundefinedを返します.angular.module('myApp')
.directive('oneToTen', function() {
return {
require: '?ngModel',
link: function(scope, ele, attrs, ngModel) {
if (!ngModel) return;
ngModel.$parsers.unshift(function(viewValue) {
var i = parseInt(viewValue);
if (i >= 0 && i < 10) {
ngModel.$setValidity('oneToTen', true);
return viewValue;
} else {
ngModel.$setValidity('oneToTen', false);
return undefined;
}
});
}
};
});
$formatters
バインドされたngModel値が変化し、
$parsers
配列の解析器によって処理されると、この値は$formatters
流水線に渡される.$parsers
配列がフォームの正当性状態を変更できるのと同様に、$formatters
の関数もこれらの値を変更してフォーマットすることができる.これらの関数は、単純な検証目的よりも、ビュー内の視覚的な変化を処理するためによく使用されます.たとえば、値をフォーマットするとします.この値には、
$formatters
配列でフィルタを実行できます.angular.module('myApp')
.directive('oneToTen', ['$filter', function($filter) {
return {
require: '?ngModel',
link: function(scope, ele, attrs, ngModel) {
if (!ngModel) return;
ngModel.$formatters.unshift(function(v) {
return $filter('number')(v);
});
}
};
}]);
カスタムformコントロール('ngModel'を使用)
カスタムコントロールを「ngModel」と正常に動作させ、双方向バインドの効果を達成するには、次の必要があります.
$render
にデータが伝達された後にデータをレンダリングすることを担当するNgModelController#$formatters
方法を実装する.$setViewValue
メソッドを呼び出し、任意のユーザがコントロールと対話した後、モデルが更新される必要がある場合に呼び出す.これは通常、DOMイベントリスナーで完了します.ngModel.$setViewValue(value)
関数は、コントローラ上のローカルの$viewValue
を更新し、各$parser
関数(ベリファイアを含む)に値を渡します.値が解析され、
$parser
流線のすべての関数が呼び出されると、値は$modelValue
属性に割り当てられ、命令のng-model
属性が提供する式に渡される.最後に、すべてのステップが完了すると、
$viewChangeListeners
のすべてのリスナーが呼び出されます.なお、
$setViewValue()
を単独で呼び出すと、新しいdigestループは呼び出されないため、命令を更新するには、$viewValue
を設定した後にdigestを手動でトリガーする必要がある.$setViewValue()
メソッドは、コールバック関数を持つjQueryプラグインを使用するなど、カスタムコマンドでカスタムイベントをリスニングするのに適しています.コールバック時に$viewValue
を設定し、digestループを実行します.angular.module('form-example2', []).directive('contenteditable', function() {
return {
require: 'ngModel',
link: function(scope, elm, attrs, ctrl) {
// ->
elm.on('blur', function() {
scope.$apply(function() {
ctrl.$setViewValue(elm.html());
});
});
// ->
ctrl.$render = function() {
elm.html(ctrl.$viewValue);
};
// DOM
ctrl.$setViewValue(elm.html());
}
};
});
この命令は、役割ドメインを分離していないことに注意してください.このコマンドに独立した役割ドメインを設定すると、内部ngModelは外部ngModelの対応する値を更新できません.AngularJSはローカル役割ドメイン以外で値をクエリーします.
ngMessages
フォームを検証してデータを記入する場合、データが間違っているか無効である場合にヒント情報が表示され、angularでフォームを書く場合、ヒント情報は
ng-show
でトリガ状況で表示することができ、重複タグを減らすためにngMessages命令を利用することができる.angular-messagesはangularのモジュールであり、アプリケーション依存モジュールとして導入することができます.
angular.module("MyApp",["ngMessages"]);
<form name="signup_form" novalidate ng-submit="signupForm()" ng-controller="signupController">
<label>Your namelabel>
<input type="text"
placeholder="Name"
name="name"
ng-model="signup.name"
ng-minlength=3
ng-maxlength=20 required/>
<div class="error" ng-messages="signup_form.name.$error">
<div ng-message="required">Make sure you enter your namediv>
<div ng-message="minlength">Your name must be least 3 charactersdiv>
<div ng-message="maxlength">Your name cannot be longer than 20 charactersdiv>
div>
<button type="submit">Submitbutton>
form>
これにより、フォームデータの入力に誤りがあると、メッセージが1回に1つしか表示されず、コード内の順序が表示され、すべてのエラーを同時に表示する必要がある場合は、
ng-messages
命令の横にng-messages-mutiple
を付ける必要があります.あるいは、ビュー内の複数の場所で同じプロンプトメッセージを呼び出す必要がある場合が多い場合、次のようにメッセージをテンプレートに保存できます.
方法1
<!--In template/error.html-->
<div ng-message="required">This field is requireddiv>
<div ng-message="minlength">The field must be at least 3 charactersdiv>
<div ng-message="maxlength">The field cannot be longer than 20 charactersdiv>
方法2
<script type="text/ng-template" id="my-custom-messages">
"required">This field is required</div>
This field is too shortdiv>
script>
ng-messages-include
id:
<div class="error" ng-messages="signup_form.name.$error" ng-messages-include="template/error.html">
div>
<div class="error" ng-messages="signup_form.name.$error" ng-messages-include="my-custom-messages">
div>