AngularJSのMVCパターンと起動処理をまとめました。
※目次をクリックすると目次の下部にコンテンツが表示されます。
モデル、コントローラ、ビューの役割はごく簡単には下記のようになります。
①モデル:アプリケーションのデータ
②コントローラ:データを操作するロジック
③ビュー:データを表示するロジック
簡単なサンプルコードを作成し、AngularJSのMVCパターンの基本を確認します。
1)サンプルコード
<!doctype html>
<html ng-app="myApp">
<head>
<meta charset="utf-8">
<title>AngularJSサンプル</title>
<script src="js/angular.min.js"></script>
<script>
var model = {
group: "果物",
items: [
{ name: "リンゴ", price: 100},
{ name: "メロン", price: 300},
{ name: "スイカ", price: 500}
]
};
var myApp = angular.module("myApp", []);
myApp.controller("myCtrl",function ($scope) {
$scope.products = model;
});
</script>
<link href="css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container" ng-controller="myCtrl">
<div class="page-header">
<h1>{{products.group}}の商品リスト</h1>
</div>
<table class="table">
<thead><tr><th>名前</th><th>価格</th></tr></thead>
<tbody><tr ng-repeat="item in products.items">
<td>{{item.name}}</td>
<td>{{item.price}}円</td>
</tr></tbody>
</table>
</div>
</body>
</html>
①モデル:アプリケーションのデータ
上記サンプルコードでは、データをHTMLのビューから分離して<script>要素内でJavaScriptで定義しています。
var model = {
:
このサンプルコードでは、データを定義しているだけですが、サーバーからデータをロードしたり、保存、変更の操作を行ったりもします。
②コントローラ:データを操作するロジック
コントローラは、”データを操作するロジック”と簡単に記述しましたが、データを保存、修整する操作はモデルに含まれ、コントローラは、データをフォーマット、フィルターしたりする操作はビューに含まれ、厳密に分けるのは難しいです。
モデルとビューの間に位置し、モデルとビューを連携させる役割を持つ、ぐらいの理解でも良いと思います。
上記サンプルコードでは、”myApp”というAngularJSモジュールを作成し、モジュールのcontrollerメソッドで”myCtrl”という名前のコントローラを定義しています。
$scopeは、AngularJSのビルトインのサービス(scopeの前の”$”は、AngularJSのビルトインサービスである事を示す)で、データや機能をビューに提供する役割を持ちます。
コントローラで
$scope.products = model;
と設定したことによって、モデルで定義したデータをビューからproductsにアクセスできるようになります。
③ビュー:データを表示するロジック
“myApp”というモジュール内の”myCtrl”というコントローラで$scope.productsを定義したので、HTMLビュー内でモジュール(ng-app=”myApp”)とコントローラ(ng-controller=”myCtrl”)を指定したHTML要素内でproductsにアクセスする事が出来ます。
上記サンプルコードでは、下記二つの部分で使用しています。
{{products.group}}
二重カーリーブラケット(波括弧、中括弧)を記述するとコントローラで設定した$scope.productsとバインディングが行われ、モデルからコントローラを経由してHTMLにデータが挿入されます。
<tr ng-repeat=”item in products.items”>
AngularJSのビルトインの機能であるng-repeatディレクティブによって、$scope.productsの内のitemsの配列データがテーブル内に挿入されます。
・AngularJSアプリケーションを自動起動する際、ngAppディレクティブを使用します。
・このディレクティブを指定した要素がアプリケーションのルートになります。
(指定例)
<html ng-app=”phonecatApp”>
●アプリのブートストラップ中に行われていること
①依存性注入(dependency injection)に使用される”injector”が生成される。
②injectorがアプリのモデル用のコンテキストになるrootスコープを生成する。
③そのときにAngularはngAppのルート要素で開始されるDOMをコンパイルし、ディレクティブやバインディングの処理を行う。
・一度アプリが起動されるとマウスクリックやキー押下などのブラウザイベントが入ってくるのを待機する。
・イベントが発生するとAngularはモデルが更新されていないかチェックし、変更されていたらビュー内の関係するバインディングを更新してビューに反映させる。
- ビルトインのディレクティブの概要
- データバインディングのディレクティブの概要
- ng-repeatを使ってリスト、テーブル、フィルター
- ng-includeを使って別のHTMLファイルを埋め込み
- ng-switchを使って内部にあるHTMLテンプレートの表示を切り替え
- ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
- ng-class、ng-styleを使ってCSSを設定
- イベント処理
- 有効、無効を切替えるディレクティブ
- フォームの入力チェックを行い、動的にCSS追加
- ng-optionsを使ってSelectメニューを作成
- ng-repeatを使ってラジオボタンを作成
- ビルトインのフィルターの使用方法
- ビルトインのフィルターで関数を使用
- カスタムフィルターの使用方法
- Bootstrap3を使ってページング
- スクリプト内でフィルターを使用、既存のフィルターを拡張
- サービスの概要とfactory、service、providerの使い分け
- $qサービスでpromise/deferredパターン
- $httpサービスの概要、サーバーからJSONデータ取得
- $httpサービスのPOSTでデータ送信
- $qサービスを使ってhttpリクエストを複数実行
- $httpサービスのinterceptorの使用方法
- AngularJSのwithCredentialsの設定、CORS
- $timeoutサービスと$intervalサービス
- $resourceサービスを使ってREST
- $locationサービスを使ってURLを操作
- $routeサービスと$resourceサービスを使ったサンプルを作成
- routeChangeSuccessを使ってflashメッセージ表示
- JavaScript、CSSを含むHTMLデータをバインドして表示
- ビルトインのディレクティブの概要
- データバインディングのディレクティブの概要
- ng-repeatを使ってリスト、テーブル、フィルター
- ng-includeを使って別のHTMLファイルを埋め込み
- ng-switchで内部にあるHTMLテンプレートの表示を切り替え
- ng-if、ng-show、ng-hideを使って表示、非表示を切り替え
- ng-class、ng-styleを使ってCSSを設定
- イベント処理
- 有効、無効を切替えるディレクティブ
- フォームの入力チェックを行い、動的にCSS追加
- ng-optionsを使ってSelectメニューを作成
- ng-repeatを使ってラジオボタンを作成
- ビルトインのフィルターの使用方法
- ビルトインのフィルターで関数を使用
- カスタムフィルターの使用方法
- Bootstrap3を使ってページング
- スクリプト内でフィルターを使用、既存のフィルターを拡張
- サービスの概要とfactory、service、providerの使い分け
- $qサービスでpromise/deferredパターン
- $httpサービスの概要、サーバーからJSONデータ取得
- $httpサービスのPOSTでデータ送信
- $qサービスを使ってhttpリクエストを複数実行
- $httpサービスのinterceptorの使用方法
- AngularJSのwithCredentialsの設定、CORS
- $timeoutサービスと$intervalサービス
- $resourceサービスを使ってREST
- $locationサービスを使ってURLを操作
- $routeサービスと$resourceサービスを使ったサンプルを作成
- routeChangeSuccessを使ってflashメッセージ表示
- JavaScript、CSSを含むHTMLデータをバインドして表示