SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

AngularJSアプリ開発を支援する便利モジュール

AngularJSアプリ開発に役立つ小粒なライブラリ ~ ストレージ/イベント処理/入力値検証

AngularJSアプリ開発を支援する便利モジュール(10)

自作の入力値検証ルールを実装する - UI Validate

 別稿「AngularJSで、入力フォームを簡単にチェックできるディレクティブを使う」で紹介したように、AngularJSでは、標準でもさまざまな検証機能が提供されています。ただ、実際のアプリでは、標準の検証ルールだけでは賄えないようなルールも多々あります。

 そのようなアプリ独自の検証ルールを実装するのが、UI Validateの役割です。Bowerを利用することで、以下のコマンドでインストールできます。

> bower install --save angular-ui-validate

 まずは、UI Validateの具体的な例として、パスワードとパスワード(確認)が等しいかどうかをチェックしてみます。

リスト5 validate.html
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS</title>
<script src="bower_components/angular/angular.min.js"></script>
<!-- (1)validate.jsをインポート -->
<script src="bower_components/angular-ui-validate/dist/validate.js"></script>
<script src="scripts/validate.js"></script>
</head>
<body ng-controller="MyController">
<form name="regist" novalidate>
  <div>
    <label for="password">パスワード:</label><br />
    <input id="password" name="password" type="password"
      ng-model="user.password" />  </div>
  <div>
    <label for="password_confirm">パスワード(確認):</label><br />
    <!-- (3)検証関数を指定 -->
    <input id="password_confirm" name="password_confirm" type="password"
      ng-model="password_confirm"
      ui-validate="'confirm($value, user.password)'"
      ui-validate-watch="user.password" />
    <!-- (5)エラーメッセージを表示 -->
    <span ng-show="regist.password_confirm.$error.validator">
      パスワードとパスワード(確認)が、異なります。</span>
  </div>
</form>
</body>
</html>
リスト6 validate.js
// (2)ui.validateモジュールへの依存関係を
angular.module('myApp', [ 'ui.validate' ])
  .controller('MyController', ['$scope', function($scope) {
    // (4)入力値と比較対象とを比較する検証関数
    $scope.confirm = function(input, compared) {
      return input === compared;
    };
  }]);
パスワード/パスワード(確認)の値が異なる場合にエラー
パスワード/パスワード(確認)の値が異なる場合にエラー

 UI Validateを利用するには、ライブラリ本体(validate.js)をインポートした上で、アプリモジュール(myApp)からはui.validateモジュールへの依存関係を宣言します(2)。

 これでUI Validateが有効になりましたので、検証対象の要素に対して、ui-validate属性で検証関数を指定します(3)。検証関数には、ここでは検証の対象値($value)と比較する値(user.password)を渡します。あとは、両者が等しいかどうかを比較し、一致しない場合は検証エラーとします(4)。UI Validateでは、検証関数がfalseを返した場合にエラーと見なします。

 ui-validate-watch属性は、指定された式(ここでは、user.password)を監視し、その値が変更されたタイミングで検証を実施します(3)。デフォルトでは検証対象の要素だけを監視対象としますが、このように複数の要素に跨った検証では、ui-validate-watch属性で明示します。

 検証結果によってエラーメッセージを表示しているのが(5)です。UI Validateでは、「フォーム名.要素名.$error.validator」で検証結果(true/false)を参照できます。

複数の検証ルールも適用可能

 ui-validate属性に「検証名: 検証関数」のハッシュを与えることで、複数の検証ルールをまとめて指定することも可能です。以下は、先ほどのリスト5をハッシュ形式で書き換えたものです(もちろん、この場合はひとつしか検証ルールを指定していませんので、敢えてハッシュとする意味はありません)。

リスト7 validate_hash.html
<!DOCTYPE html>
<html ng-app="myApp">
<head>
<meta charset="UTF-8" />
<title>AngularJS</title>
<script src="bower_components/angular/angular.min.js"></script>
<script src="bower_components/angular-ui-validate/dist/validate.js"></script>
<script src="scripts/validate_hash.js"></script>
</head>
<body ng-controller="MyController">
<form name="regist" novalidate>
  <div>
    <label for="password">パスワード:</label><br />
    <input id="password" name="password" type="password"
      ng-model="user.password" />  </div>
  <div>
    <label for="password_confirm">パスワード(確認):</label><br />
    <input id="password_confirm" name="password_confirm" type="password"
      ng-model="password_confirm"
      ui-validate="{ cmp_pass : 'confirm($value, user.password)' }"
      ui-validate-watch="user.password" />
    <span ng-show="regist.password_confirm.$error.cmp_pass">
      パスワードとパスワード(確認)が、異なります。</span>
  </div>
</form>
</body>
</html>

 ハッシュで指定した場合には、検証結果も「フォーム名.要素名.$error.検証名」の形式で参照しなければならない点に注意してください(ここでは「regist.password_confirm.$error.cmp_pass」です)。

まとめ

 以上、本稿ではアプリを開発する上で欠かせないWeb Storageの操作、イベントリスナー/検証ルールの定義を支援するライブラリについて紹介しました。次回は引き続き、これまでの連載の中で扱えなかった小粒なライブラリについて解説する予定です。

参考資料

この記事は参考になりましたか?

連載通知を行うには会員登録(無料)が必要です。
既に会員の方はを行ってください。
AngularJSアプリ開発を支援する便利モジュール連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト(ウイングスプロジェクト)

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/9201 2016/02/04 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー