Angular.jsのフォーム周りのバリデーションなどの実装を試してみます。
サンプルコード
HTML
<div ng-controller="form_Ctrl">
<form name="sampleForm" novalidate>
<dl>
<dt>テキスト</dt>
<dd>
<input type="text" name="text" ng-model="sample.text" ng-required="true" ng-pattern="/^[a-zA-Z0-9]+$/">
<div ng-show="sampleForm.text.$invalid">なにかエラーがあります。</div>
<div ng-show="sampleForm.text.$valid">OKです。</div>
<div ng-show="sampleForm.text.$error.required">必須項目です。</div>
<div ng-show="sampleForm.text.$error.pattern">半角英数で入力して下さい。</div>
<div ng-show="sampleForm.text.$pristine">入力値に変更がない時はここが表示されます。</div>
<div ng-show="sampleForm.text.$dirty">入力値に変更があるとここが表示されます。</div>
</dd>
</dl>
<dl>
<dt>パスワード</dt>
<dd>
<input type="password" name="password" ng-model="sample.password" ng-minlength="8" ng-maxlength="16">
<div ng-show="sampleForm.password.$invalid">入力内容が正しくありません。</div>
<div ng-show="sampleForm.password.$valid">OKです。</div>
<div ng-show="sampleForm.password.$error.minlength">8文字以上入力して下さい。</div>
<div ng-show="sampleForm.password.$error.maxlength">16文字以下で入力して下さい。</div>
</dd>
</dl>
<dl>
<dt>メールアドレス</dt>
<dd>
<input type="email" name="email" ng-model="sample.email">
<div ng-show="sampleForm.email.$error.email">メールアドレスが正しくありません。</div>
</dd>
</dl>
<dl>
<dt>数値</dt>
<dd>
<input type="number" name="number" ng-model="sample.number">
<div ng-show="sampleForm.number.$error.number">数値が正しくありません。</div>
</dd>
</dl>
<dl>
<dt>URL</dt>
<dd>
<input type="url" name="url" ng-model="sample.url">
<div ng-show="sampleForm.url.$error.url">URLが正しくありません。</div>
</dd>
</dl>
<dl>
<dt>チェックボックス</dt>
<dd>
<input type="checkbox" name="checkbox" ng-model="sample.checkbox">{{sample.checkbox}}
</dd>
</dl>
<dl>
<dt>ラジオ</dt>
<dd>
<input type="radio" name="radio2" ng-model="sample.radio2" value="ラジオ1">
<input type="radio" name="radio2" ng-model="sample.radio2" value="ラジオ2">
{{sample.radio2}}
</dd>
</dl>
<dl>
<dt>セレクト1</dt>
<dd>
<select name="select" ng-model="sample.select" ng-options="option.name for option in selectOptions">
<option value="">-----</option>
</select>
{{sample.select}}
</dd>
</dl>
<dl>
<dt>セレクト2</dt>
<dd>
<select name="select2" ng-model="sample.select2" ng-options="option.text as option.name for option in selectOptions">
<option value="">-----</option>
</select>
{{sample.select2}}
</dd>
</dl>
<dl>
<dt>セレクト3</dt>
<dd>
<select name="select3" ng-model="sample.select3" ng-options="key for (key, value) in selectOptions2">
<option value="">-----</option>
</select>
{{sample.select3}}
</dd>
</dl>
<dl>
<dt>テキストエリア</dt>
<dd>
<textarea name="textarea" ng-model="sample.textarea" ng-maxlength="100"></textarea>
<div ng-hide="sampleForm.textarea.$error.maxlength">残り:{{100 - sample.textarea.length}}文字</div>
<div ng-show="sampleForm.textarea.$error.maxlength">100文字以下で入力して下さい。</div>
</dd>
</dl>
<input type="submit" value="送信" ng-disabled="sampleForm.$invalid">
</form>
</div>
JavaScript
angular.module('app', []).controller('form_Ctrl', function($scope) {
$scope.sample = {};
// 初期値設定サンプル
$scope.sample.text = '初期値';
$scope.sample.checkbox = true;
$scope.sample.select2 = 'セレクト1';
$scope.selectOptions = [
{
'name': 'select1',
'text': 'セレクト1'
}, {
'name': 'select2',
'text': 'セレクト2'
}, {
'name': 'select3',
'text': 'セレクト3'
}
]
$scope.selectOptions2 = {
'セレクト1': 'select1',
'セレクト2': 'select2',
'セレクト3': 'select3'
}
});
フォーム周り実装のデモページ
ブラウザによるHTML5のバリデーションを無効にするために、formタグにnovalidateを付与しています。
属性
| ng-required | 必須入力かどうかを設定。 trueの場合は必須入力。 |
|---|---|
| ng-pattern | 正規表現を使ったバリデーションを設定。 |
| ng-minlength | 最小文字数を設定。 |
| ng-maxlength | 最大文字数を設定。 |
| ng-disabled | 要素が有効かどうか設定。 trueの場合は有効。 |
| ng-options | selectのオプションの設定。 オブジェクトや配列などから設定できる。 |
バリデーション
各要素のバリデーションのチェックは、【formのname】.【バリデーション要素のname】.【チェック内容】のように記述します。
例えば、上記サンプルのパスワード部分で8文字以上入力しているかチェックしたい場合、sampleForm.password.$error.minlengthのようになります。
正しい場合はfalse、エラーがある場合はtrueが返ってくるので、ng-showでエラーの出し分けを行えます。
| $invalid | 内容が正しい場合にtrueを返す。 |
|---|---|
| $valid | 内容が正しくない場合にtrueを返す。 |
| $pristine | 内容が最初から変化していない場合にtrueを返す。 |
| $dirty | 内容に変化があった場合にtrueを返す。 |
| $error | エラーが出ている場合にtrueを返す。 チェック内容はrequiredやpatternなどあらかじめ設定しておくものと、emailやurlなどのようにtype属性で使用できるものがある。 |
【参考サイト】
コメントが承認されるまで時間がかかります。