STAP細胞が見つかるまでひたすら適当な細胞を生成し続けるプログラム pic.twitter.com/7rcZzKwqSe
— YaGi (@yagiyyyy) 2014, 6月 2
↑に触発されて作ってみた。
中身は単純明快、ひたすら文字列を生成するガチャ。
そんなわけで、ソース見つつ読んでもらえればと。
準備
AngularJS読み込む
当たり前だけど、何は無くともとりあえず読み込んでおく。
<head> <meta charset="UTF-8"> <title>STAP NO.1</title> <script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.15/angular.min.js"></script> <script>
要素をAngularJSと関連付ける
タグにng-app
と記述することで、AngularJSのアプリであることを示す。
また、ng-controller
で、後述するアプリケーションと表示とを関連付ける。
<body> <div ng-app ng-controller="Ctrl">
アプリケーションの記述
とりあえず作る
AngularJSを読み込んだ後にfunctionを作る。
とりあえず今は何も考えずに$scope
を渡しておこう。
<script> function Ctrl($scope){ … } </script>
データと表示を紐付ける
本題。
$scopeに入れる
扱いたいデータは$scope内に格納。
$scope.cells = ['STEP', 'STAP', 'STOP'];
テンプレート側
HTML側でデータを表示する部分は{{[変数名]}}
の形で記述しよう。
{{cells.length}}回 実験しました!
↑なんかは$scope.cells.length
に対応していて、配列が増えると勝手に表示も更新される。
繰り返し要素
同じ形式のタグが繰り返される場合は、ng-repeat
が利用できる。
<button ng-repeat="loop in [1, 10, 100, 1000, 10000]">{{loop}}回 実験する</button>
↑のコードだと、1・10・100・1000・10000のそれぞれのボタンが作成できる。
今回は単純にbuttonタグだけを繰り返しているが、内部にもっと複雑な要素が入ったdivタグなんかも繰り返すことができる。
それぞれの回数はloop
という変数に格納されてタグ内でアクセスできる。
ちなみに$scope
の中の配列や連想配列についても同様に使うことができる。
<span ng-repeat="cell in cells track by $index">{{cell}}細胞</span>
しかし、配列の場合は全くおなじ要素が含まれるとngRepeat:dupes
というエラーがでてしまうため、ループを内容ではなくインデックスで管理するようにtrack by $index
をつけてやる。
要素によってclassを変える
例えば今回cellがSTAPだった場合だけbingoというクラスにしたいので、ng-class="{[クラス名]:'条件'}"を使って下記の様に記述する。
<span ng-class="{bingo:cell == 'STAP'}" ng-repeat="cell in cells track by $index">{{cell}}細胞</span>
クリックによるアクションの記述
ng-click
要素に記述することで、function内に指定した動作をさせることができる。
<button ng-repeat="loop in [1, 10, 100, 1000, 10000]" ng-click="generate(loop)">{{loop}}回 実験する</button>
$scope.generate = function(loop){ …諸々の動作… }
まとめ
この程度だったら別にAngularJS使うまでもないというか、むしろ毎度ng-repeatでcells展開するせいでcellsが増えると動作が厳しくなってしまってる面はあるのだけど、とにかくデータバインディングによって凄く簡潔にアプリケーションを作成できることは分かったと思う。
jQueryが「HTMLに機能を付加してく」イメージなのに対して、AngularJS使ってると「動作に合わせてHTMLを組んでく」ような印象になるのが興味深い。
- 作者: Brad Green,Shyam Seshadri,牧野聡
- 出版社/メーカー: オライリージャパン
- 発売日: 2014/04/18
- メディア: 大型本
- この商品を含むブログ (1件) を見る