技術メモ

技術メモ

ラフなメモ

AngularJSのチュートリアルをやってみた

AngularJSのチュートリアル

chap0

ng-app ディレクティブ

ng-app ディレクティブは AngularJSがアプリケーションのルート要素とみなすHTML要素にフラグをつけるために使用する。これによってHTMLページ全体またはその一部のみをAngularJSのアプリケーションとして扱う必要があるのかどうかAngularJSに伝えることができる。

angular.js スクリプト

<script src="lib/angular/angular.js"></script> によってHTMLページがダウンロードされたときにブラウザがコールバックを登録するangular.jsスクリプトをダウンロードしている。コールバックが実行されるとAngularJSはngAppディレクティブを探しにいく。AngularJSがディレクティブを見つけると、ngAppディレクティブが定義されている要素であるアプリケーションのDOMルートでアプリケーションをブートストラップする。

バインディング

{{}} バインディングはAngularJSに式を評価して、バインディングの変わりに結果をDOMに挿入するように指示する。式の結果によって更新できるため効率的である。

char1

静的なHTMLファイルの生成。

char2

AngularJSアプリケーションでは、コードの構造化としてModel-View-Controller(MVC)デザインパターンを利用することを想定している。

View & Template

ViewはHTMLテンプレートを通したモデルの投影である。モデルが変わるたびにAngularJSが適切なバインディングを設定して、ビューが動的に更新される。

ng-repeat ディレクティブ

要素の繰り返しを表現したいときに使う。 <li ng-repeat="phone in phones"><li> をテンプレートとして使用して、リスト内の要素に対して <li> 要素を作成するように指示している。

      <li ng-repeat="phone in phones">
          <span>{{phone.name}}</span>
          <p>{{phone.snippet}}</p>
      </li>

上記はPhoneListControllerコントローラに設定されているアプリケーションのモデルを参照していることになる。

Model & Controller

ng-controller ディレクティブ

controllerで処理を記述していくイメージ。 データモデルは PhoneListController としてインスタンス化されている。コントローラは、$scope パラメータを取るコンストラクタ関数である。$scope はビューにデータを渡したり、ビューから発生したイベントを監視したり、ビューとのやり取りを実施できるオブジェクト。 PhoneListController<body> 要素の下でDOMのサブツリーを役割を担っている。

phonecatApp.controller('PhoneListController', function PhoneListController($scope) {}}); はPhoneListController という名前のコントローラを宣言して、AngularJSモジュールのphonecatAppに登録している。これによって ng-app ディレクティブが phonecatApp モジュール名のアプリケーションのブートストラップ時にロードするモジュールとして指定されるようになった。PhoneListControllerコントローラはコントローラ関数に注入されている $scope のデータを付与している。このコントローラスコープは <body ng-controller="PhoneListController"> タグ内にあるすべてのバインディングから使用できる。

<body ng-controller="PhoneListController"> は app.js の PhoneListController を参照する。

scope

Scope は非常に重要な概念である。scope は Model、Controller、template を連携させるための接着剤と考えることができる。Modelに加えられた変更はViewに反映される。Viewで行われた変更はモデルに反映される。

char3

テンプレート+コントローラの組み合わせは非常に一般的なパターンなので、コンポーネント化して再利用可能にしたほうがよい。

コンポーネントを使用するためには .component() メソッドを使用する。合わせてコンポーネントの名前とコンポーネント定義オブジェクト(CDO)を提供しなければならない。新婦砂ケールでは、CDOはテンプレートとコントローラのみで構成される。(コントローラも省略は可能)

※ TODO: $ctrl はコントローラのビューモデルオブジェクト...??

コントローラコンストラクタの this にデータとメソッドを割り当てている。

テンプレートからはエイリアスを使用してコントローラインスタンスを参照できる。

char4

リファクタリング!機能別にファイルをまとめる。<phone-list></phone-list> が示しているのは chap3 で作成したコンポーネントである。つまり phoneList として呼ばれている component(\`phoneList\', {...}) である。ここでテンプレートとなるHTMLを外部から templateUrl: 'phone-list/phone-list.template.html', として参照することで見通しがよくなる。AngularJS は phone-list.template.html からテンプレートを取得するためのリクエストを発行する。外部リクエストの管理方法は $templateRequest$templateCache のサービスを利用することができる。

char5

コンポーネントテンプレート

標準HTMLタグの <input> タグを追加している。

データバインディング:入力ボックスの値を ngModel で指定されたデータモデル変数にバインドして同期させている。 $ctrl.query としてバインドしたデータは filter:$ctrl.query としてすぐに使用されている。データモデルを変更してrepeatの入力が変更されるとrepeatはDOMを更新して、モデルの現在の状態を反映する。filter 関数は $ctrl.query の値を使用してクエリに一致するレコードのみを含む新しい配列を生成する。 ng-repeat は filter を通して動的にビューを更新している。

char6

コンポーネントテンプレート

HTMLに <select> 要素を追加することでユーザがプルダウンで選択することができる。orderBy フィルタを用いることで入力の配列をコピーしてコピー後の配列を並び替えることができる。

コンポーネントコントローラ

age プロパティを追加している。モデルからUI、UIからモデルへの双方向データバインディングを体験できる。

char7

コンポーネントコントローラ

WebサーバにHTTPリクエストを送信するために、コントローラで $thhp サービスを使用する。サービスはAngularJSのDIサブシステムによって管理される。

※ この章ちょっと難しいが重要っぽいので見直す

char8

コンポーネントテンプレート

ng-src ディレクティブを使用すると無効な場所にHTTPリクエストを送信することを防ぐことができる。

char9

ng-route ディレクティブ

そもそも「ルーティング」とは、リクエストされたURLに応じて、処理の受け渡し先(コントローラー/テンプレート)を決定すること、または、その仕組みのことを言う。

char10

char11

char12

char13

char14

感想

  • TemplateとModelとViewの関係を理解することが重要そうと感じた。(当たり前だけど)
  • 後半は疲れてしまったのでもう少し内容を見直したい

参考資料