<?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>金井 健一 &#8211; HTML5Experts.jp</title>
	<atom:link href="/canidoweb/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>【βリリース記念】5分でわかる！Angular2のススメ</title>
		<link>/canidoweb/18001/</link>
		<pubDate>Fri, 25 Dec 2015 02:00:26 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[最新動向]]></category>
		<category><![CDATA[システム開発]]></category>
		<category><![CDATA[Angular2]]></category>
		<category><![CDATA[AngularJS]]></category>

		<guid isPermaLink="false">/?p=18001</guid>
		<description><![CDATA[2015年12月15日に、Angular v2.0.0-beta.0がリリースされました。Angular2の発表から実に1年です。まだβ版ではありますが、1つの区切りとして現状のAngular2についてお伝えしていきます...]]></description>
				<content:encoded><![CDATA[<p>2015年12月15日に、Angular v2.0.0-beta.0がリリースされました。Angular2の発表から実に1年です。まだβ版ではありますが、1つの区切りとして現状のAngular2についてお伝えしていきます。</p>

<p><img src="/wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io.png" alt="" width="640" height="364" class="aligncenter size-full wp-image-18012" srcset="/wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io.png 640w, /wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io-300x171.png 300w, /wp-content/uploads/2015/12/FireShot-Pro-Screen-Capture-032-One-framework_-Angular-2-angular_io-207x118.png 207w" sizes="(max-width: 640px) 100vw, 640px" /></p>

<h2>何が変わったのか</h2>

<p>以前から言われているとおり、かなり大きく変わっています。これまでのJavaScriptフレームワークでは<code>MVC</code>や<code>MVVM</code>と呼ばれるデザインパターンが多く採用されてきました。</p>

<p>しかし、<code>Web Components</code>の仕様策定が進んでいる今、この仕様と共存できるようなコンポーネント指向のフレームワークが求められてきています。そういった背景から、MVW(hatever)という思想で開発されていたAngular1に対し、Angular2はコンポーネント指向で設計されています。</p>

<p>Angular2は、以下のような特徴をもっています。</p>

<ul>
<li>処理速度・パフォーマンスの向上</li>
<li>よりシンプルに、わかりやすく</li>
<li>クロスプラットフォーム</li>
<li>Angular1からのシームレスなアップグレード</li>
<li>柔軟な開発</li>
<li>網羅的なルーティング</li>
<li>Dependency Injection（DI）</li>
<li>レガシーブラウザのサポート</li>
<li>アニメーション（開発中）</li>
<li>国際化 (Internationalization:I18N) とアクセシビリティ（開発中）</li>
</ul>

<p><a href="https://angular.io/features.html" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">angular.io &#8211; FEATURES &amp; BENEFITS より</a></p>

<p>これだけだと伝わりにくいので要約すると、</p>

<ul>
<li>Angular1での課題の解決</li>
<li><code>ES2015/ESNext</code>への対応</li>
<li><code>TypeScript</code>などのトランスパイラとの連携</li>
<li><code>Web Components</code>や<code>Polymer</code>との連携</li>
<li>AndroidやiOS対応</li>
<li>デスクトップアプリ対応</li>
<li>サーバサイドレンダリング対応</li>
</ul>

<p>などが挙げられます。</p>

<p>Angular1の良いところはそのままに、課題については改善していこうという姿勢です。その結果もあり、Angular1で問題となっていた<code>Dirty Checking</code>を解決したことや、サーバサイドレンダリングをおこなえるようになったことで、パフォーマンスが飛躍的にアップしました。Angular2開発当初にパフォーマンスの問題で一時取り止めになっていた双方向バインディングも現在では実装されています。</p>

<p>それに加えて、Angular2では、モバイルやデスクトップアプリでも快適に動作するよう考慮されています。すでに<a href="http://ionicframework.com/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Ionic</a>や <a href="https://www.nativescript.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">NativeScript</a>で、ハイブリッドアプリやネイティブUIモバイルアプリを開発する際も、Angular2を利用することができるようになりました。</p>

<p>これらを見れば、多岐にわたる変更があるだろうことが想像できるでしょう。</p>

<p>Angular2が提供するAPIは一新されていて、Angular1との互換性はありません。しかし、Angular1のディレクティブの設定に似ているため、多少経験がある方であれば理解するのはさほど難しくはありません。</p>

<p></p><pre class="crayon-plain-tag">// コンポーネントを作成するサンプル
(function(app) {
  app.AppComponent = ng.core
    .Component({
      selector: 'my-app',
      template: '&lt;h1&gt;My First Angular 2 App&lt;/h1&gt;'
    })
    .Class({
      constructor: function() {}
    });
})(window.app || (window.app = {}));</pre><p></p>

<h2>弱点がなくなった Angular2</h2>

<p>他のフレームワークと比較すると、Angular1は入力フォームの多い、管理画面などの開発において圧倒的な強みがありました。双方向バインディングや強力なフォームバリデーション機能が備わっていたためです。</p>

<p>Angular2は、それらの機能を備えたままさらに強力になったといえます。管理画面だけでなく、モバイル環境やデスクトップアプリでも問題なく利用できるので、活躍する場が広がっていくでしょう。</p>

<p>サーバサイドレンダリングを利用すれば、SEOが必要なWEBサイトのフロントですら利用することができるようになります。
このように、苦手としていたことの改善によるパフォーマンスが向上したことで、今後は限定的なケースではなく、さまざまなケースで利用されることが期待できます。</p>

<p>他にも、開発する際の自由度があがったことも大きなメリットです。<code>ES5</code>で実装することもできますし、<code>ES2015</code>で実装することもできます。また<code>TypeScript</code>や<code>Babel</code>などのトランスパイラも組み合わせて開発することも可能になりました。特に、Angular2自身が<code>TypeScript</code>で実装されていることもあり、tsdファイルを作成する必要がなくなったことは、<code>TypeScript</code>ユーザにとって嬉しいことではないでしょうか。</p>

<h2>Angular2 のこれから</h2>

<p>現在、β版にはなり多少は落ち着いたのかなといった印象ですが、今後はAngularユーザやコミュニティによってさらにブラッシュアップされていくことと思います。まだまだドキュメントが少ないことが懸念されますが、これらはAngularの開発チームでも課題になっているので、時間とともに解決されていくでしょう。</p>

<p>最後に気になるv2.0.0のリリース時期について、あくまでも予想ではありますが、 2016/5/4〜6にかけて開催される <a href="http://www.ng-conf.org/" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ng-conf</a>でv2.0.0をお披露目したいのではないかと推測しています。（もしかしたら間に合わないかも、ということもありますが&#8230;）</p>
]]></content:encoded>
			</item>
		<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>
		<item>
		<title>キミはionicを知っているか？AngularJS+PhoneGap+美麗コンポーネント群！</title>
		<link>/canidoweb/7359/</link>
		<pubDate>Mon, 07 Jul 2014 01:00:05 +0000</pubDate>
		<dc:creator><![CDATA[金井 健一]]></dc:creator>
				<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[AngularJS]]></category>
		<category><![CDATA[PhoneGap]]></category>
		<category><![CDATA[ionic]]></category>
		<category><![CDATA[ハイブリッド]]></category>

		<guid isPermaLink="false">/?p=7359</guid>
		<description><![CDATA[連載： ハイブリッドアプリ開発最前線 (4) ionic 概要 ionicはそのサイトのデザインからも見てわかるとおり、シンプルかつ美しいUIを取り揃えたコンポーネント群で、Apache Cordova を拡張して作られ...]]></description>
				<content:encoded><![CDATA[<div class="seriesmeta">連載： <a href="https://html5experts.jp/series/hybrid-special/" class="series-181" title="ハイブリッドアプリ開発最前線" data-wpel-link="internal">ハイブリッドアプリ開発最前線</a> (4)</div><p><a href="https://html5experts.jp/wp-content/uploads/2014/06/ionic1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/06/ionic1.png" alt="ionic" width="2000" height="1120" class="aligncenter size-full wp-image-7618" srcset="/wp-content/uploads/2014/06/ionic1.png 640w, /wp-content/uploads/2014/06/ionic1-300x168.png 300w, /wp-content/uploads/2014/06/ionic1-1024x573.png 1024w, /wp-content/uploads/2014/06/ionic1-207x115.png 207w" sizes="(max-width: 2000px) 100vw, 2000px" /></a></p>

<h2>ionic 概要</h2>

<p>ionicはそのサイトのデザインからも見てわかるとおり、シンプルかつ美しいUIを取り揃えたコンポーネント群で、<a href="http://cordova.apache.org/" title="Apache Cordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Cordova</a> を拡張して作られているフレームワークです。<br>
また、動的なUIコンポーネントを実装するために、 <a href="https://angularjs.org/" title="AngularJS" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a> を採用してる点もその特徴の1つです。</p>

<p>ionicがサポートしているプラットフォームは、iOS 6+とAndroid 4+です。（ただしAndroidについては、2.3+でもいくつかの機能を提供してるとのこと）<br>
現状ではこの2つのプラットフォームのみですが、Windows PhoneとFirefoxOSについても今後対応を進めていくようです。</p>

<h3>特徴</h3>

<ul>
<li><a href="http://cordova.apache.org/" title="Apache Cordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Cordova</a>を拡張して作られている、モバイルUIフレームワーク＆開発ツール</li>
<li>UIがシンプル、かつ美しい</li>
<li><a href="https://angularjs.org/" title="AngularJS" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS</a> を採用している</li>
<li>現状はiOS 6+とAndroid 4+のサポートのみで、Windows PhoneとFirefox OSについては今後対応予定</li>
</ul>

<h2>ionicでHello, World</h2>

<h3>事前準備</h3>

<p>ionicでアプリケーションを開発するためには、 <a href="http://nodejs.org/" title="Node.js" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Node.js</a> がインストールされている必要があります。
インストールされていない場合は、上記のリンクからダウンロードしてインストールしておきましょう。<br>
また、各プラットフォーム（Android、iOS）ごとに必要なSDKのインストールも必要です。<br>
こちらについては本稿では触れませんのでご了承ください。</p>

<h3>1. cordova-cliとionic-cliのインストール</h3>

<p>Node.jsのnpm-cliを利用して、cordova-cliとionic-cliをインストールします。<br>
今回はiOSを対象に解説していくため、ios-sim-cliもインストールしておきます。<br>
これは後述するiOSのエミュレータでの確認をするために必要となります。</p>

<p></p><pre class="crayon-plain-tag">$ sudo npm install -g cordova ionic
  $ sudo npm install -g ios-sim</pre><p></p>

<h3>2. ionicプロジェクトの作成</h3>

<p>ionicのプロジェクトを作成します。</p>

<p></p><pre class="crayon-plain-tag">$ ionic start myApp tabs</pre><p></p>

<p>実行すると&#8221;myApp&#8221;という名前のプロジェクトが作成されます。<br>
&#8220;tabs&#8221;という引数はデフォルトのテンプレートの指定になります。<br>
&#8220;blank&#8221;、&#8221;tabs&#8221;、&#8221;sidemenu&#8221;の3種類がテンプレートとして用意されていますので、ご自身で作成するアプリケーションの要件に応じて使い分けるとよいでしょう。<br>
各テンプレートのレイアウトは以下の画像を参照してください。
<a href="https://html5experts.jp/wp-content/uploads/2014/06/project.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/06/project.png" alt="project" width="1820" height="682" class="aligncenter size-full wp-image-7613" srcset="/wp-content/uploads/2014/06/project.png 640w, /wp-content/uploads/2014/06/project-300x112.png 300w, /wp-content/uploads/2014/06/project-1024x383.png 1024w, /wp-content/uploads/2014/06/project-207x77.png 207w" sizes="(max-width: 1820px) 100vw, 1820px" /></a></p>

<h3>3. 対象のプラットフォームを設定</h3>

<p>次に、作成したプロジェクト内に移動して作成するプラットフォームを指定します。<br>
iOS 向けの設定を追加します。</p>

<p></p><pre class="crayon-plain-tag">$ cd myApp
  $ ionic platform add ios</pre><p></p>

<h3>4. Hello, Worldを書く</h3>

<p>今回のケースでは、アプリケーション起動時に表示されるhtmlはmyApp/www/templates/tab-dash.htmlなので、このhtmlファイルを編集します。<br>
以下のように、h1要素のテキストを&#8221;Hello, World&#8221;に書き換えます。</p>

<p></p><pre class="crayon-plain-tag">&lt;ion-view title="Dashboard"&gt;
      &lt;ion-content class="has-header padding"&gt;
          <h1>Hello, World</h1>
      &lt;/ion-content&gt;
  &lt;/ion-view&gt;</pre><p></p>

<h3>5. 変更を確認する</h3>

<p>アプリケーションの動作確認をおこなうためには2つの方法があります。<br>
主にデザインやレイアウトの確認を行なう場合であればWebサーバを起動して確認するとよいでしょう。</p>

<p></p><pre class="crayon-plain-tag">$ ionic serve</pre><p></p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/06/serve1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/06/serve1-300x245.png" alt="serve" width="300" height="245" class="aligncenter size-medium wp-image-7620" srcset="/wp-content/uploads/2014/06/serve1-300x245.png 300w, /wp-content/uploads/2014/06/serve1-1024x838.png 1024w, /wp-content/uploads/2014/06/serve1-207x169.png 207w, /wp-content/uploads/2014/06/serve1.png 640w" sizes="(max-width: 300px) 100vw, 300px" /></a></p>

<p></p><pre class="crayon-plain-tag">$ ionic build ios
  $ ionic emulate ios</pre><p></p>

<p>ネイティブのAPIを利用している箇所は、エミュレータを起動して確認しましょう。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/06/emu1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/06/emu1-200x300.png" alt="emu" width="200" height="300" class="aligncenter size-medium wp-image-7617" srcset="/wp-content/uploads/2014/06/emu1-200x300.png 200w, /wp-content/uploads/2014/06/emu1-137x207.png 137w, /wp-content/uploads/2014/06/emu1.png 426w" sizes="(max-width: 200px) 100vw, 200px" /></a></p>

<h3>6. 実機での動作確認</h3>

<p>Androidであれば、実機と開発環境をUSBケーブルで接続してから</p>

<p></p><pre class="crayon-plain-tag">$ ionic run android</pre><p></p>

<p>で実機にインストールすることができます。</p>

<p>iOSの場合は、ionicコマンドから実機にインストールすることができません。<br>
iOSでの実機確認を行なうには、XcodeからmyApp/platforms/iosを開いて実機にインストールすることができます。<br>
これ以降はXcodeでの作業になります。</p>

<h3>ionic の機能</h3>

<p>ionicコマンドで作成されたプロジェクトには、以下のディレクトリが配置されます。<br>
これらがionic独自のディレクトリで、Apache Cordovaとは大きく異なる点です。<br>
Apache Cordovaで作られたプロジェクトにはこれらのディレクトリは存在しません。</p>

<p></p><pre class="crayon-plain-tag">myApp/www/lib/ionic
  myApp/scss/</pre><p></p>

<p>myApp/www/lib/ionic配下のファイル群がionicが提供するUIコンポーネント群の実体です。<br>
またionicはSassを採用しているので、myApp/scss/やmyApp/www/lib/ionic/scss配下のファイルを編集することで、UIコンポーネントをカスタマイズすることも可能です。<br>
もちろん、myApp/www/lib/ionic/css配下のcssファイルを直接編集することも可能ですが、7000ステップ以上ありますので現実的ではありません。<br>
カスタマイズを前提とするならば、Sassの導入は必須となります。</p>

<h3>Optional</h3>

<p>ionicは、タスクランナーとしてgulp.jsを採用しています。<br>
gulp-cliを利用することで、Sassを自動コンパイルさせたりすることもできます。<br>
設定方法について詳しく知りたい方は<a href="http://ionicframework.com/docs/guide/installation.html" title="install gulp" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">こちら</a>を参照してください。</p>

<h2>ngCordovaモジュール</h2>

<p>2014/6/3に公式ブログから <a href="http://ngcordova.com/" title="ngCordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ngCordova</a> のαリリースが発表されました。<br>
cordova.js（ネイティブの機能を呼び出すためのApache Cordovaのライブラリ）をAngularJSでラップしたモジュールです。<br>
ionicにとっては、cordova.jsを直接呼び出して使用するよりも、ngCordovaというAngularJSのモジュールとして扱うことで親和性が高くなり、これまで以上に機能拡張が容易になります。</p>

<h2>最後に</h2>

<p>以下のProductsのページには、&#8221;Coming mid-2014: Powerful mobile development tools and services for Ionic.&#8221;と記述されていて、近々大きなリリースを予定しているのが伺えます。<br>
注目されているフレームワークの1つですので、今のうちから試してみてはいかがでしょうか。</p>

<p><a href="https://html5experts.jp/wp-content/uploads/2014/06/products1.png" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer"><img src="/wp-content/uploads/2014/06/products1.png" alt="products" width="2000" height="884" class="aligncenter size-full wp-image-7619" srcset="/wp-content/uploads/2014/06/products1.png 640w, /wp-content/uploads/2014/06/products1-300x132.png 300w, /wp-content/uploads/2014/06/products1-1024x452.png 1024w, /wp-content/uploads/2014/06/products1-207x91.png 207w" sizes="(max-width: 2000px) 100vw, 2000px" /></a></p>

<h2>参照リソース</h2>

<ul>
<li><a href="http://ionicframework.com/" title="ionic" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ionic http://ionicframework.com/</a></li>
<li><a href="http://ngcordova.com/" title="ngCordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ngCordovaモジュール http://ngcordova.com/</a></li>
<li><a href="http://ionicons.com/" title="ionicons" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">ionicons</a></li>
<li><a href="http://cordova.apache.org/" title="Apache Cordova" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">Apache Cordova</a></li>
<li><a href="https://angularjs.org/" title="AngularJS" data-wpel-link="external" target="_blank" rel="follow external noopener noreferrer">AngularJS https://angularjs.org/</a></li>
</ul>
]]></content:encoded>
		
		<series:name><![CDATA[ハイブリッドアプリ開発最前線]]></series:name>
	</item>
	</channel>
</rss>
