ng-submitを利用してformのvalidationを使う

ng-clickではなくformにng-submitを設定してフォームを送信

ng-clickを利用したデータの送信

buttonタグなどにng-clickを追加して、他のフォーム部品(textareaなど)に設定したng-modelと引数を共有することで、フォームの値を送信することが可能。

下のコードの場合は、

<button ng-click="addAnswer(Body)" type="submit">回答する</button>

Bodyをtextareaに追加したng-modelと共有することで、データのバインディングをすることが出来る。

formタグとng-submitを利用したデータ送信

フォームのサンプル

formとng-submitを使うことで、AngularJSのvalidation機能を利用したフォームを構築することが可能。ベーシックなフォームの例は以下のとおり。

<form name="webForm" novalidate ng-submit="addAnswer(new)">
    <input type="email" required ng-model="new.email">
    <textarea placeholder="文章を入力" required ng-model="new.Body"></textarea>
    <button type="submit" ng-disabled="webForm.$invalid">回答する</button>
</form>

バリデーション変数

formにname属性を追加する点がポイントで、name属性を利用してAngularJSのバリデーション変数を利用することが出来る。上のフォームでは、buttonにng-disabledを追加し、その値として

webForm.$invalid

を設定している。そのため、フォーム内にバリデーションエラーが発生している限り、buttonにdisabled属性が付いたままになる。

バリデーション変数は、$invalidのほかにも用意されていて、

$dirty

という変数がある。この変数はフォーム部品がユーザーに操作される(入力されたり選択された状態)されるとtrueを返す。

バリデーション変数については、AngularJSの公式サイトだと以下のURLで詳細を調べることが出来る。

https://docs.angularjs.org/api/ng/type/form.FormController

フォーム内の階層アクセス

上で載せたサンプルコードのinputタグにname属性を追加して、フォーム部品専用のバリデーション変数を参照することも可能。

<input name="webEmail" type="email" required ng-model="new.email">

inputにnameを設定すれば、

webForm.webEmail.$dirty

として、input専門の状態を取得することが可能。

webForm.$dirtyがフォーム全体の状態を担当しているのに対し、webForm.webEmail.$dirtyとすることで、

個々のフォーム専用のバリデーション変数

を取得することが可能になる。

AngularJSのvalidationではclass属性が動的に変化する

ユーザーが入力した内容により、フォームのバリデーション変数が変化することが分かった。実際には、バリデーション変数だけでなく、

class属性

も変化する。

追加されるclass属性は、

  • ng-valid
  • ng-invalid
  • ng-pristine
  • ng-dirty

で、フォーム部品の状態に応じて動的にこれらのclass属性が切り替わるようになっている。下の画像では、

  • メールアドレス(input)
  • 回答文(textarea)

という2つの部品から構成されるフォームで、

validation-class

回答文のみがvalidになるように文字を入力した状態になり、その場合のclass属性の状態を確認できる。

  • ユーザーが入力したか否か
  • バリデーションOKかNGか

フォームの状態に応じてclass属性が追加される。そのため、

<style>
    form .ng-invalid.ng-dirty { background-color: #f04124; }
    form .ng-valid.ng-dirty { background-color: #43ac6a; }
</style>

上のようにcssを追加すれば、バリデーション結果を視覚的に表現することが可能。

validation-okng-angular

Webエンジニアブログにコメント

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

ng-submitを利用してformのvalidationを使うの記事にコメントを投稿