<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	xmlns:series="http://organizeseries.com/"
	>

<channel>
	<title>初心者から中級者まで、今注目のAngularJS徹底解説 &#8211; HTML5Experts.jp</title>
	<atom:link href="/series/angularjs-beginning/feed/" rel="self" type="application/rss+xml" />
	<link>https://html5experts.jp</link>
	<description>日本に、もっとエキスパートを。</description>
	<lastBuildDate>Sat, 07 Jul 2018 03:14:05 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.7.19</generator>
	<item>
		<title>AngularJSのControllerとScopeの基礎を学ぼう</title>
		<link>/canidoweb/16732/</link>
		<pubDate>Mon, 07 Sep 2015 01:00:30 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=16732</guid>
		<description><![CDATA[連載： 初心者から中級者まで、今注目のAngularJS徹底解説 (3)連載企画「AngularJS徹底解説」の第3回目は、ControllerとScopeの基礎について解説していきます。 AngularJS は MVW...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/angularjs-beginning/" class="series-224" title="初心者から中級者まで、今注目のAngularJS徹底解説" data-wpel-link="internal">初心者から中級者まで、今注目のAngularJS徹底解説</a> (3)</div><p>連載企画「AngularJS徹底解説」の第3回目は、ControllerとScopeの基礎について解説していきます。</p>

<h2>AngularJS は MVW(hatever)!!!</h2>

<p>AngularJSはMVC(Model-View-Controller)フレームワークと呼ばれることが多いですが、一部の開発者からは MVVM(Model-View-ViewModel)である、という声もあがっていて、ある時期に「一体どっちなんだ！？」という状態になりました。<br>
そこで、そういった経緯に対してAngularJSチームが、そこについての議論は本筋ではないとして、AngularJSはMVW(Model-View-Whatever)である、と明言しています。</p>

<p>今回解説するControllerは、このWhateverの役割にあたる機能です。実際に「Whatever = 何でもいい」とはいっても、&#8221;Controller&#8221;という名のとおり、MVCパターンとして見れば M-V-&#8220;Controller&#8221;にあたる機能ですので、その概念から外れることはありません。</p>

<h3>Controller の基本</h3>

<p>コントローラは以下のように記述します。他にもいくつか書き方があるのですが、今回はこの書き方で解説していきます。</p>

<p>まず、<code>myApp</code>アプリに<code>myCtrl</code>というコントローラを作成してみます。</p>

<p></p><pre class="crayon-plain-tag">angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // ここにコードを書いていく
  }]);</pre><p> 
以下の意味になります。
</p><pre class="crayon-plain-tag">...
  .controller.('コントローラ名', ['依存サービス', function(依存サービス){
    // ここにコードを書いていく
  }]);</pre><p></p>

<p>$scopeについては、 ビューにデータなどを渡したり、ビューから発生したイベントを監視するなど、ビューとのやり取りを行うことができる特別なオブジェクトです。（AngularJSでは直接DOM操作をすることは推奨されていないため、この$scopeを通じて行います。そのためほとんどのケースでコントローラを記述する際に定義することになります）</p>

<p>また複数依存するサービスが複数ある場合は、</p>

<p></p><pre class="crayon-plain-tag">...
  .controller.('コントローラ名', ['依存サービス1', '依存サービス2' ... , function(依存サービス1, 依存サービス2 ...){
    // ここにコードを書いていく
  }]);</pre><p> 
このように、配列に追加していく形で定義することができます。</p>

<p>先ほどの$scopeを利用して、ビューにモデルの値を引き渡します。<br>
テンプレート(HTML)箇所については、前回までに解説した通りです。</p>

<p></p><pre class="crayon-plain-tag">&lt;!DOCTYPE html&gt;
&lt;html lang="ja" ng-app="myApp"&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Controller&lt;/title&gt;
  &lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body ng-controller="myCtrl"&gt;
&lt;div&gt;筆者：{{myName}}&lt;/div&gt;

&lt;div&gt;
  エキスパートたち
  &lt;ul&gt;
    &lt;li ng-repeat="expert in expertList"&gt;{{expert}}&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;div&gt;
  {{author.name}} ( twitter - {{author.twitter}} )
&lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // Model の初期化 ①
    var myName = 'can.i.do.web';
    var expertList = ['Shumpei', 'komasshu', 'yoshikawa_t'];
    var author = { name: 'きゃない', twitter: 'can_i_do_web' };
    // View にバインディング ②
    $scope.myName = myName;
    $scope.expertList = expertList;
    $scope.author = author;
  }]);
&lt;/script&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>$socpeを利用することで、ビューとやりとりすることができます。①で様々な形式のモデルの初期化、②で$scopeにプロパティを追加していくかたちで、 ビューに値を渡すことができます。<br>上記のほかにも複雑なオブジェクトや、関数などもバインドすることが可能です。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/sample1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/sample1-300x188.png" alt="sample1" width="300" height="188" class="aligncenter size-medium wp-image-16932" srcset="/wp-content/uploads/2015/09/sample1-300x188.png 300w, /wp-content/uploads/2015/09/sample1.png 640w, /wp-content/uploads/2015/09/sample1-207x129.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<h3>Controller の適用範囲</h3>

<p>コントローラに限らず、ではあるのですが、AngularJSのディレクティブには適用範囲があります。<br>それは、そのディレクティブを定義したDOMの範囲とイコールです。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body&gt;
  &lt;div ng-controller="myCtrl"&gt;
    myCtrl内: {{name}} &lt;!-- ① --&gt;
  &lt;/div&gt;
  myCtrl外: {{name}} &lt;!-- ② --&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    $scope.name = 'can.i.do.web';
  }]);
&lt;/script&gt;
&lt;/body&gt;</pre><p></p>

<p>①のように<code>ng-controller="myCtrl"</code>と定義したdivタグの内部のみ、初期化された<code>name</code>を表示（取り扱う）することができます。
②は<code>ng-controller="myCtrl"</code>が定義されているdivタグの外側にあるため、<code>myCtrl</code>で定義した<code>name</code>にアクセスすることはできません。</p>

<p>このように、AngularJSではそれぞれの コントローラなどのディレクティブがお互いに干渉しないよう、適用される範囲のみでそれぞれの機能を果たします。そうすることで個々の機能が疎結合になり、保守性が高くなります。</p>

<h3>Controller の分割</h3>

<p>最初に挙げたサンプルのように画面全体に対して1つのControllerで運用していった場合、かなり多機能なコントローラになってしまいます。</p>

<p>例えば以下のケースだとどうなっているか見ていきましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
  &lt;header&gt;
    ... &lt;!-- header --&gt;
  &lt;/header&gt;
  &lt;main&gt;
    ... &lt;!-- main --&gt;
  &lt;/main&gt;
  &lt;footer&gt;
    ... &lt;!-- footer --&gt;
  &lt;/footer&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // いろいろな機能のコード
  }]);
&lt;/script&gt;</pre><p></p>

<p>上記は<code>body</code>全体に対してのみのコントローラとなっています。ヘッダやフッタに関しては、一般的なアプリケーションでは共通的な機能と言えるでしょう。</p>

<p>それに対して上記の場合は、画面ごとにヘッダやフッタのデータやイベント等の振る舞いを毎回記述しなくてはなりません。先述したとおり、保守性を高めるために、 コントローラを分割すると良いでしょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
  &lt;header ng-controller="headerCtrl"&gt;
    ... &lt;!-- header --&gt;
  &lt;/header&gt;
  &lt;main ng-controller="mainCtrl"&gt;
    ... &lt;!-- main --&gt;
  &lt;/main&gt;
  &lt;footer ng-controller="footerCtrl"&gt;
    ... &lt;!-- footer --&gt;
  &lt;/footer&gt;
&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    // 画面全体に渡るコード
  }])
  .controller('headerCtrl', ['$scope', function($scope){
    // headerで必要な機能のコード
  }])
  .controller('mainCtrl', ['$scope', function($scope){
    // main で必要な機能のコード
  }])
  .controller('footerCtrl', ['$scope', function($scope){
    // footer で必要な機能のコード
  }]);
&lt;/script&gt;</pre><p></p>

<p>上記のようにコントローラを分割することで、機能の塊を小さくできます。<code>headerCtrl</code>や<code>footerCtrl</code>を切り分けることによって、アプリケーション全体で共通的なヘッダ、フッタの機能として利用することもできます。</p>

<p>また、メインコンテンツ内も機能的に煩雑になっているようであれば、さらにコントローラを分割して運用していくとよいでしょう。</p>

<h3>Scope</h3>

<p>スコープはビューとコントローラの間に立って、モデルをビューにバインディングしたり、ビューから発生したイベントを受け取って何かしら振る舞う、といった役割を持ちます。$scopeはそれを実際に行なうためのオブジェクトです。</p>

<p>スコープはDOMツリーと同様ツリー構造になっていて、<code>ng-app</code>を基点にDOMツリーに沿うように構成されます。そして<code>ng-controller</code> と記述している箇所で<code>ng-app</code>の子スコープとして新たなスコープが生成されています。Chrome DevToolsなどで該当するDOMを見てみると、<code>ng-scope</code>というクラス名が自動的に付与されているため、これを元に確認することができます。</p>

<p>最初のサンプルの場合、<code>ng-repeat</code>でも新しくスコープを生成するため、<code>expertList</code>の<code>&lt;li&gt;</code>にも同じように付与されています。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/09/sample1-a1.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/09/sample1-a1.png" alt="sample1-a" width="640" height="262" class="aligncenter size-full wp-image-16941" srcset="/wp-content/uploads/2015/09/sample1-a1.png 640w, /wp-content/uploads/2015/09/sample1-a1-300x123.png 300w, /wp-content/uploads/2015/09/sample1-a1-207x85.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>&#8220;Controllerの適用範囲&#8221; で解説した内容はこのスコープのツリー構造と関わっています。</p>

<p>以下の例を見てみましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="myCtrl"&gt;
&lt;p&gt;①親スコープの'name' -&gt; {{name}}&lt;/p&gt;
&lt;p&gt;②親から見ようとした 'twitter' -&gt; {{twitter}}&lt;/p&gt;

  &lt;div ng-controller="myChildCtrl"&gt;
    &lt;p&gt;③myChildCtrl の 'name' -&gt; {{name}}&lt;/p&gt;
    &lt;p&gt;④myChildCtrl の 'twitter' -&gt; {{twitter}}&lt;/p&gt;
  &lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('myCtrl', ['$scope', function($scope){
    $scope.name = 'can.i.do.web';
  }])
  .controller('myChildCtrl', ['$scope', function($scope){
    $scope.twitter = 'きゃない';
  }]);
&lt;/script&gt;</pre><p></p>

<p>実行してみると、このように表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/08/scope.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/08/scope-300x120.png" alt="scope" width="300" height="120" class="aligncenter size-medium wp-image-16745" srcset="/wp-content/uploads/2015/08/scope-300x120.png 300w, /wp-content/uploads/2015/08/scope.png 640w, /wp-content/uploads/2015/08/scope-207x82.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>スコープはツリー上に構成されるため、スコープの親子関係が生まれます。<br>
原則、子スコープから親スコープの値は参照できますが、その反対はできません。<br>
親である<code>myCtrl</code>で定義された、<code>name</code>というプロパティは、子である<code>myChildCtrl</code>の<code>name</code>として参照することができるため、表示されています。<br>
反対に、親スコープから子スコープのプロパティを参照できないため、②では何も表示されていません。</p>

<p>子スコープが新たに生成されるタイミングは、コントローラを定義する（ng-controller）など、一部の（ビルトイン）ディレクティブ などを定義した場合です。<br>
どのディレクティブ が新しくスコープを生成するかや、詳細な挙動については、AngularJS にかなり慣れている必要があります。<br>
しかし、はじめから完璧に理解する必要は全くありません。スコープという概念があり有効範囲や親子関係がある、ということを頭の片隅においておくと良いでしょう。</p>

<h4>Controller 間でデータ共有</h4>

<p>親子コントローラ間でデータを共有するためには以下のように記述しましょう。</p>

<p></p><pre class="crayon-plain-tag">...
&lt;body ng-controller="parentCtrl"&gt;

  &lt;div&gt;
    &lt;p&gt;親スコープ&lt;/p&gt;
    &lt;input type="text" ng-model="autor.name"&gt;
  &lt;/div&gt;

  &lt;div ng-controller="childCtrl"&gt;
    &lt;p&gt;子スコープ&lt;/p&gt;
    &lt;input type="text" ng-model="autor.name"&gt;
  &lt;/div&gt;

&lt;script&gt;
angular.module('myApp', [])
  .controller('parentCtrl', ['$scope', function($scope){
    // 親スコープ
    var author = {};
    author.name = 'Kanai';
    // bind
    $scope.autor = author;
  }])
  .controller('childCtrl', ['$scope', function($scope){
    // 子スコープ
  }]);
&lt;/script&gt;</pre><p></p>

<p>これまでのサンプルとの違いは、<code>$scope.autor.name</code>のように、直接<code>$scope.name</code>としていない点です。<br>
このように<code>$scope</code>とバインドしたいプロパティとの間に、オブジェクトを挟むことで、親子間でデータを共有することができます。</p>

<p>こうすることで、親子スコープのどちらの<code>input</code>でも、片方の入力値を書き換えれば、もう一方のデータも書き変わります。<br>
先述してきたサンプルの場合は、JavaScriptのプロトタイプチェーンの都合上、親子関係が破綻してしまいます。そのため、値を書き換えても相互にデータの書き換えを行なうことができません。<br>
データの書き換えや参照が思ったようにうまくいかない場合は、このことを覚えておくとよいかもしれません。</p>

<h3>まとめ</h3>

<p>今回は、ControllerとScopeの基礎を解説しました。<br>
特にスコープについては複雑な概念や実装になっていますので、いきなり全てを把握することは難しいです。AngularJS の経験を積むとともに徐々に学んでいきましょう。<br>
次回はサービスについての解説を予定しています。</p>
]]></content:encoded>
		
		<series:name><![CDATA[初心者から中級者まで、今注目のAngularJS徹底解説]]></series:name>
	</item>
		<item>
		<title>AngularJSの強力なフォームバリデーションを活用しよう</title>
		<link>/canidoweb/13708/</link>
		<pubDate>Fri, 13 Mar 2015 03:00:44 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=13708</guid>
		<description><![CDATA[連載： 初心者から中級者まで、今注目のAngularJS徹底解説 (2)連載企画「AngularJS徹底解説」の第2回目は、Angularが備えている強力なフォームバリデーションについて解説します。 AngularJS ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/angularjs-beginning/" class="series-224" title="初心者から中級者まで、今注目のAngularJS徹底解説" data-wpel-link="internal">初心者から中級者まで、今注目のAngularJS徹底解説</a> (2)</div><p>連載企画「AngularJS徹底解説」の第2回目は、Angularが備えている強力なフォームバリデーションについて解説します。</p>

<h1>AngularJS の強力なフォームバリデーション</h1>

<p>ご存知の通り、HTML5の仕様にもフォームバリデーションがあり、<a href="http://caniuse.com/#search=validation" title="バリデーション実装状況" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">主要なモダンブラウザ</a>であれば既に実装されています。しかし、ブラウザに実装されたバリデーション機能は、まだ実践で使うには使い勝手がよいものとは言えません。もうしばらくは、プラグインやライブラリに頼ったり、または、自身で実装していく必要がありそうです。</p>

<p>今回から<a href="http://can-i-do-web.github.io/html5experts/angularjs/#/number2" title="デモ" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">デモページ</a>を用意してみました。実際に動作していることを確認できます。レイアウト調整をしているため、本稿で掲載するサンプルコードとは多少異なること、ご了承ください。</p>

<h2>各input要素のバリデーション</h2>

<p>まず、Angularでのバリデーションは、双方向バインディングの特性を活かして、入力と同時にチェックを行うことができます。</p>

<p>例えば以下のように 記述することで、それぞれのテキストボックスに対して必須チェック・文字数チェックを行うことができます。</p>

<p></p><pre class="crayon-plain-tag">&lt;form&gt;
  &lt;input type="text" ng-model="demoModel" ng-required="true"&gt;
  &lt;input type="text" ng-model="demoModel2" ng-maxlength="4"&gt;
&lt;/form&gt;</pre><p></p>

<p>まずは、<code>ng-required</code>と<code>ng-maxlength="4"</code>となっている箇所がバリデーションの定義です。とても簡単に記述することができます。</p>

<p>ただ上記のままでは、チェックがエラーだったとしても、何の変化もおきません。そこで、次はバリデーションチェックエラーの場合にエラーメッセージを出してみます。</p>

<p>先のサンプルに少し書き足して、以下のようなコードにします。</p>

<p></p><pre class="crayon-plain-tag">&lt;form name="demoForm" novalidate&gt;
  &lt;input type="text" name="input3" ng-model="demoModel" ng-required="true"&gt;
  &lt;p ng-show="demoForm.input3.$error.required"&gt;入力必須です&lt;/p&gt;

  &lt;input type="text" name="input4" ng-model="demoModel2" ng-maxlength="4"&gt;
  &lt;p ng-show="demoForm.input4.$error.maxlength"&gt;4文字までです&lt;/p&gt;
&lt;/form&gt;</pre><p></p>

<p>このように、実際バリデーションを利用するにあたっては、form要素にname属性とnovalidate属性を、各input要素にはname属性とng-model属性を定義することがほぼ必須となります。忘れずに定義するようにしましょう。</p>

<p>form要素のnovalidate属性は、ブラウザに実装されているバリデーション機能をOFFにするためです。またform、input共にname属性がついていますが、こうすることでバリデーションチェックの結果を取得することができます。</p>

<p>実行すると以下のようにエラーメッセージが表示されます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/invalid.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/invalid-640x250.png" alt="invalid" width="640" height="250" class="aligncenter size-large wp-image-13715" srcset="/wp-content/uploads/2015/03/invalid.png 640w, /wp-content/uploads/2015/03/invalid-300x117.png 300w, /wp-content/uploads/2015/03/invalid-207x81.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p><code>ng-show</code>にそれぞれ渡している値がバリデーションチェックの結果です。それぞれの&#8221;form名&#8221;.&#8221;input名&#8221;.$errorというオブジェクトに保持されます。<code>$error</code>の中にある<code>required</code>や<code>maxlength</code>はチェックエラーのときに、trueになります。エラーではない場合はfalseとなるため、これを利用してエラーメッセージの表示切り替えを行うことができます。</p>

<p>上記のサンプルでは、必須チェックのみ、文字数チェックのみでしたが、複数のバリデーションを定義することも可能です。</p>

<p></p><pre class="crayon-plain-tag">&lt;form name="demoForm2" novalidate&gt;
  &lt;input type="text" name="input5"　ng-model="demoModel5" ng-required="true" ng-minlength="4" ng-pattern="^[0-9]+$"&gt;
  &lt;p ng-show="demoForm2.input5.$error.required"&gt;入力必須です&lt;/p&gt;
  &lt;p ng-show="demoForm2.input5.$error.minlength"&gt;4文字以上です&lt;/p&gt;
  &lt;p ng-show="demoForm2.input5.$error.pattern"&gt;半角数値のみです&lt;/p&gt;

  &lt;p&gt;demoForm.input5.$error.pattern : {{ demoForm.input4.$error }}&lt;/p&gt;
&lt;/form&gt;</pre><p></p>

<p>このように、各エラーに対してをエラーメッセージを細かく設定することができます。逆に、エラーメッセージは1つだけ表示させたい場合もあります。以下のように、<code>$invalid</code>を利用すると実現することができます。<code>$invalid</code>は、複数定義したバリデーションのどれかひとつでもエラーであればtrueとなるためです。</p>

<p></p><pre class="crayon-plain-tag">&lt;form name="demoForm2" novalidate&gt;
  &lt;input type="text" name="input6"　ng-model="demoModel6"　ng-required="true" ng-minlength="4" ng-pattern="/^[0-9]+$/"&gt;
  &lt;p ng-show="demoForm2.input6.$invalid"&gt;4文字以上の半角数字のみ（必須）&lt;/p&gt;
&lt;/form&gt;</pre><p></p>

<p>取得可能なバリデーションチェックの結果を一部挙げると、</p>

<ul>
<li>&#8220;form名&#8221;.&#8221;input名&#8221;.$error

<ul>
<li>各バリデーションチェックエラーのプロパティを保持</li>
</ul></li>
<li>&#8220;form名&#8221;.&#8221;input名&#8221;.$valid

<ul>
<li>該当要素のバリデーションチェックが、エラーでないとき true</li>
</ul></li>
<li>&#8220;form名&#8221;.&#8221;input名&#8221;.$invalid

<ul>
<li>該当要素のバリデーションチェックが、エラーであるとき true</li>
</ul></li>
<li>&#8220;form名&#8221;.&#8221;input名&#8221;.$dirty

<ul>
<li>該当要素の値が初期値から変更があったとき true</li>
</ul></li>
<li>&#8220;form名&#8221;.$valid

<ul>
<li>フォーム内の全要素に対して1つもバリデーションチェックエラーがないとき true</li>
</ul></li>
<li>&#8220;form名&#8221;.$invalid

<ul>
<li>フォーム内の全要素に対して1つもバリデーションチェックエラーがあるとき true</li>
</ul></li>
</ul>

<p>となります。
この他にも input 要素が初期値かどうか、form が submit されたかどうかのフラグも取得可能です。</p>

<h2>バリデーションによるクラスの付与</h2>

<p>先述したとおり、Angular ではエラーであるかどうか等、true/falseのフラグを保持しています。これに加えて、各要素にクラスの付与も同時に行っています。
例えば、<code>ng-required</code>を定義すると、<code>ng-invalid-required</code>というクラスが要素に付与されます。Google Chrome Developer Tools等から確認することができます。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2015/03/devtools.png" data-wpel-link="internal"><img src="/wp-content/uploads/2015/03/devtools-640x41.png" alt="devtools" width="640" height="41" class="aligncenter size-large wp-image-13714" srcset="/wp-content/uploads/2015/03/devtools.png 640w, /wp-content/uploads/2015/03/devtools-300x19.png 300w, /wp-content/uploads/2015/03/devtools-207x13.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a></p>

<p>自動的にクラスが付与されるため、エラー時に「要素のボーダーを赤くする」など、スタイルを設定しておくこともできます。下記は、.ng-invalid（エラーの場合）のみ場合、初期表示時から赤く表示されてしまいます。</p>

<p>それを回避するために、.ng-dirty（初期値から変更があったかどうか）を併せて記述することで、ユーザが入力するまではエラーとして扱わないようにしています。</p>

<p></p><pre class="crayon-plain-tag">.ng-invalid.ng-dirty{
  border: solid 1px red;
}</pre><p></p>

<h2>まとめ</h2>

<p>今回はフォームのバリデーション機能について解説しました。自身であれこれ設定しなくても、かなり簡単に実装することがおわかりいただけたかと思います。</p>

<p>もちろん標準の機能では実現できないケースも出てくるでしょう。その際には、<a href="https://angular-ui.github.io/" title="UI-Utils" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularUI の UI-Utils</a>  を利用することで複雑なバリデーションを実装することも可能です。</p>

<p>AngularUIのようにAngular用のプラグインも豊富に存在しているので、これらについても今後紹介していきたいと思います。</p>

<h2>ng-japan 開催！</h2>

<p><a href="http://ngjapan.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/ngjapan-640x226.png" alt="ngjapan" width="640" height="226" class="aligncenter size-large wp-image-13716" srcset="/wp-content/uploads/2015/03/ngjapan.png 640w, /wp-content/uploads/2015/03/ngjapan-300x106.png 300w, /wp-content/uploads/2015/03/ngjapan-207x73.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></a>
2015/3/21に日本で初めてとなる Angularのカンファレンス、<a href="http://www.ng-conf.org/" title="ng-conf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-japan</a>を開催します。
Angularの開発チームメンバーを招き、直接学ぶことができる場です（逐次通訳あります）。</p>

<p>そこで、<a href="https://codeiq.jp/ace/sagawah/q1384" title="CodeIQ" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">CodeIQ さんから Angular について出題</a> させてもらいました。
ぜひ、解いてみてください。
<a href="https://codeiq.jp/ace/sagawah/q1384" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2015/03/codeiq-300x135.png" alt="codeiq" width="300" height="135" class="aligncenter size-medium wp-image-13763" srcset="/wp-content/uploads/2015/03/codeiq-300x135.png 300w, /wp-content/uploads/2015/03/codeiq.png 640w, /wp-content/uploads/2015/03/codeiq-207x93.png 207w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p>HTML5 Experts.jpでも、特集企画を組んでその内容をお伝えする予定です。</p>

<p>3/5～3/6に開催された本家 <a href="http://www.ng-conf.org/" title="ng-conf" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-conf</a> では、Angular 2などのセッションが話題になっており、これからも注目すべきフレームワークの1つと言えるでしょう。</p>
]]></content:encoded>
		
		<series:name><![CDATA[初心者から中級者まで、今注目のAngularJS徹底解説]]></series:name>
	</item>
		<item>
		<title>これから始めるAngularJS</title>
		<link>/canidoweb/11543/</link>
		<pubDate>Wed, 10 Dec 2014 01:00:15 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=11543</guid>
		<description><![CDATA[連載： 初心者から中級者まで、今注目のAngularJS徹底解説 (1)これから始めるAngularJS HTML5の普及とともに、より表現豊かなWebアプリケーションを開発できるようになりました。その反面、Webアプリ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/angularjs-beginning/" class="series-224" title="初心者から中級者まで、今注目のAngularJS徹底解説" data-wpel-link="internal">初心者から中級者まで、今注目のAngularJS徹底解説</a> (1)</div><h1>これから始めるAngularJS</h1>

<p>HTML5の普及とともに、より表現豊かなWebアプリケーションを開発できるようになりました。その反面、Webアプリケーションの開発は、より複雑に、より大規模になってきています。こうした問題を解決するために、数多くのフレームワークが生まれてきました。
Backbone.jsやKnockout、最近であれば、Vue.jsやFacebook社が発表したReactなどが挙げられます。</p>

<p>本連載では、数多くあるフレームワークの中でも、今注目されている<a href="https://angularjs.org/" title="AngularJS" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a>について幅広く紹介していきます。今回は、AngularJSに触れたことのない方に向けての入門編です。</p>

<p><a href="https://angularjs.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/angularjs_logo-1024x576.png" alt="AngularJS ロゴ" width="1024" height="576" class="aligncenter size-large wp-image-11546" srcset="/wp-content/uploads/2014/11/angularjs_logo-1024x576.png 1024w, /wp-content/uploads/2014/11/angularjs_logo-300x168.png 300w, /wp-content/uploads/2014/11/angularjs_logo-207x116.png 207w, /wp-content/uploads/2014/11/angularjs_logo.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<h2>AngularJSとは</h2>

<p>AngularJSはGoogle社製のフレームワークで、冒頭で挙げたフレームワークと違い、フルスタックであることが特徴の1つです。
データバインディングやルーティング、テンプレート機能をはじめとする、Webアプリケーションを開発していく上で必要とされる機能が一通り揃っています。</p>

<p>Backbone.jsなどの場合は、最低限の機能しかしないため、不足する機能については、サードパーティ製のプラグインやライブラリと組み合わせて開発していくのが定石です。</p>

<p>一方、AngularJSでは、機能的な面でサードパーティ製のプラグインを導入することはほとんどありません。標準で用意されている機能だけでも充分な役割を果たしてくれます。</p>

<p>また、スクリーンショットにHTML enhanced(HTML拡張 ) とあるように、HTMLのような記述方法を採用しているのも大きな特徴です。</p>

<p>AngularJSの標準機能を挙げてみます。</p>

<ul>
<li>双方向データバインディング</li>
<li>シンプルなルーティング機能</li>
<li>HTML ベースのテンプレート機能</li>
<li>非同期通信のサポート</li>
<li>数多くのビルトインディレクティブ</li>
<li>フィルタ機能</li>
<li>Dependency Injectionによるモジュール管理</li>
<li>セキュリティ対策</li>
<li>テスト</li>
</ul>

<p>などなど。</p>

<p>他のフルスタックといわれるフレームワークでも、ここまで幅広く包括的に用意されているものはなかなかありません。それゆえに、他のフレームワークに比べると、学習コストが高いとされています。</p>

<p>また、どんなフレームワークにも得意／不得意があります。フルスタックとはいえAngularJSも例に漏れません。AngularJSが得意とすることは、CRUD系のアプリケーションや、ルーティング機能を活かしてのSPA(Single Page Application)などです。</p>

<p>CRUD系のアプリケーションというのは、Webサイトの管理画面、マイページなどが該当します。他にもエンタープライズ向けのシステムもCRUD系アプリケーションの典型と言えるでしょう。</p>

<p>SPAで代表的なものは、ハイブリッドアプリ、Chrome Extension、Firefox OSアプリなどが該当します。ただし、SPAの中でも、ゲームで用いるような派手なエフェクトや、canvasを利用してのグラフィック処理などは得意ではありません。このようなケースで AngularJSを採用するのは控えた方がよいでしょう。</p>

<h2>Hello World</h2>

<p>まずは、Hello Worldを試してみましょう。</p>

<p>公式サイトからダウンロードします。今回はCDNを利用します。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/11/download.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/download-1024x576.png" alt="AngularJS Download" width="1024" height="576" class="aligncenter size-large wp-image-11548" srcset="/wp-content/uploads/2014/11/download-1024x576.png 1024w, /wp-content/uploads/2014/11/download-300x168.png 300w, /wp-content/uploads/2014/11/download-207x116.png 207w, /wp-content/uploads/2014/11/download.png 640w" sizes="(max-width: 1024px) 100vw, 1024px" /></a></p>

<p>現在は1.3系（最新版）と1.2系（レガシー版）の2つのバージョンが存在しています。この2つの違いは、IE8以下のブラウザをサポートするかしないかです。1.3系ではIE8以下のブラウザはサポートされませんので、採用する際はこれを判断基準にするとよいでしょう。特に意識しなくてよい場合は、1.3系をオススメします。</p>

<p>続いて、以下のようにマークアップします。</p>

<p></p><pre class="crayon-plain-tag">&lt;!doctype html&gt;
&lt;html ng-app&gt;&lt;!-- ① --&gt;
&lt;head&gt;
  &lt;meta charset="UTF-8"&gt;
  &lt;title&gt;Hello World&lt;/title&gt;
  &lt;!-- ② --&gt;
  &lt;script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.3.3/angular.min.js"&gt;&lt;/script&gt;
&lt;/head&gt;
&lt;body&gt;
  Hello &lt;span ng-bind="myModel"&gt;&lt;/span&gt; !!!&lt;!-- ③ --&gt;
  &lt;div&gt;&lt;input type="text" ng-model="myModel"&gt;&lt;/div&gt;&lt;!-- ④ --&gt;
&lt;/body&gt;
&lt;/html&gt;</pre><p></p>

<p>AngularJSはカスタムタグやカスタム属性を記述して、対応する機能を呼び出します。このサンプルコードで行われている AngularJSに関わる設定は以下の4つです。</p>

<ul>
<li>① ng-app

<ul>
<li>AngularJSを利用することの宣言をおこないます。</li>
</ul></li>
<li>② AngularJSを読み込みます。</li>
<li>③ ng-bind

<ul>
<li>指定した&#8221;myModel&#8221;をデータバインドします。</li>
</ul></li>
<li>④ ng-model

<ul>
<li>モデル名の宣言をします。</li>
</ul></li>
</ul>

<p>ブラウザで動かしてみましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/11/helloworld1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/helloworld1.png" alt="Hello World" width="320" height="180" class="aligncenter size-full wp-image-11560" srcset="/wp-content/uploads/2014/11/helloworld1.png 320w, /wp-content/uploads/2014/11/helloworld1-300x168.png 300w, /wp-content/uploads/2014/11/helloworld1-207x116.png 207w" sizes="(max-width: 320px) 100vw, 320px" /></a></p>

<p>テキストボックスに文字を入力するのと同時にHelloの後に入力した文字が表示されます。通常であればJavaScriptでテキストボックスの入力植を取得して、Helloの後に出力する、といった処理が必要になりますが、AngularJSでは、モデルとそのデータバインディングの指定をおこなうだけで同様の処理がおこなわれます。</p>

<h2>ビルトインディレクティブ</h2>

<p>Hello Worldのサンプルでは、カスタム属性としてng-appなどを記述しました。AngularJSの仕組みで作られたカスタム要素やカスタム属性をディレクティブと呼び、特に標準で用意されているディレクティブをビルトインディレクティブと呼びます。</p>

<p>一部を除いて「ng-」で始まっているのが特徴で、70個程度のビルトインディレクティブが標準機能として用意されています。aや formなどもAngularJSによって拡張されているため、ただのHTMLの要素ではなく、これらもビルトインディレクティブとして扱われます。</p>

<p>以降、サンプルで使用したビルトインディレクティブの他に、よく利用するディレクティブをいくつか紹介します。</p>

<h3>ng-show / ng-hide / ng-if</h3>

<p>Hello Worldに以下のコードを少し追加して確認してみます。このディレクティブはいずれも、ng-show=&#8221;条件&#8221;のように記述します。条件が trueとみなされた時にそれぞれの役割を果たします。名前からもわかる通り、ng-showとng-ifはtrueのときに表示、ng-hideはtrueのときには非表示となります。</p>

<p>ng-showとng-ifの違いは、前者は{ display: none; }で表示の切り替えをおこなっているのに対し、ng-ifは条件がtrueの時は、DOMに追加、falseのときはDOMから削除しています。</p>

<p></p><pre class="crayon-plain-tag">&lt;body&gt;
  Hello &lt;span ng-bind="myModel"&gt;&lt;/span&gt; !!!
  &lt;div&gt;&lt;input type="text" ng-model="myModel"&gt;&lt;/div&gt;

  &lt;div ng-show="myModel"&gt;こんにちわ&lt;/div&gt;
  &lt;div ng-hide="myModel"&gt;入力してください！&lt;/div&gt;
  &lt;div ng-if="myModel==='World'"&gt;Hello World 完成！&lt;/div&gt;
&lt;/body&gt;</pre><p></p>

<h3>ng-class</h3>

<p>ng-classは、動的にCSSのclassの付け替えをおこなうことができます。記述方法はいくつかあるのですが、{ class 名 : 条件 } と記述するのが使いやすいです。条件については先ほどと同様です。</p>

<p></p><pre class="crayon-plain-tag">&lt;style&gt;
  .notEmpty { background-color: red; }
&lt;/style&gt;
&lt;body ng-class="{ notEmpty : myModel }"&gt;
  Hello &lt;span ng-bind="myModel"&gt;&lt;/span&gt; !!!
  &lt;div&gt;&lt;input type="text" ng-model="myModel"&gt;&lt;/div&gt;
&lt;/body&gt;</pre><p></p>

<h3>ng-repeat</h3>

<p>このディレクティブはテンプレート上で配列のループ処理を行うためのものです。情報を一覧表示する際に必ず使いますので、覚えておいていただきたいです。</p>

<p></p><pre class="crayon-plain-tag">&lt;body&gt;
  &lt;ul ng-init="items = ['html5', 'experts', 'jp']"&gt;
    &lt;li ng-repeat="item in items"&gt;
      &lt;p ng-bind="item"&lt;/p&gt;
    &lt;/li&gt;
  &lt;/ul&gt;
&lt;/body&gt;</pre><p></p>

<p>ng-initはモデルの初期化をおこなうディレクティブです。今回はサンプルのために使用しましたが、実際のアプリケーションを開発する際は、あまり使用することはないでしょう。</p>

<h2>まとめ</h2>

<p>今回は、AngularJSの基本についてと、ビルトインディレクティブについて紹介しました。これらは特にDOMを操作するためのディレクティブです。</p>

<p>AngularJSにはほかにもクリックなどのイベントの定義をするものや、form要素の拡張をおこなった強力なバリデーション機能を持つものもあります。こちらについては次回以降、順を追って紹介していく予定です。</p>

<h3>おまけ</h3>

<p>AngularJSの本、共著で書きました。</p>

<p><a href="http://www.amazon.co.jp/dp/4844336681/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/11/book-235x300.png" alt="book" width="150" height="auto" class="alignleft size-medium wp-image-11547" srcset="/wp-content/uploads/2014/11/book-235x300.png 235w, /wp-content/uploads/2014/11/book-802x1024.png 802w, /wp-content/uploads/2014/11/book-162x207.png 162w, /wp-content/uploads/2014/11/book.png 501w" sizes="(max-width: 235px) 100vw, 235px" /></a></p>
]]></content:encoded>
		
		<series:name><![CDATA[初心者から中級者まで、今注目のAngularJS徹底解説]]></series:name>
	</item>
	</channel>
</rss>
