JavaScript用のMVCフレームワークは数多く存在するが、Chrome Packaged Appsを作るときには AngularJS を使うと色々と楽できそうだ。
前置きが長くなったが早速AngularJSの使い方を見てみよう。
まずは基本から。
<!doctype html>
<html ng-app>
<head>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js"></script>
</head>
<body>
<div>
<label>Name:</label>
<input type="text" ng-model="yourName" placeholder="Enter a name here">
<hr>
<h1>Hello {{yourName}}!</h1>
</div>
</body>
</html>
重要箇所を太字にしておいた。
inputタグの ng-model で指定されたモデル "yourName" が {{yourName}} で表示されるだけのサンプルだ。なんだか取っ付きやすそうである。
次はシンプルだが十分に実用的なTODOアプリだ。
このアプリにはデータバインディング処理、コントローラーが登場する。
ファイル構成は以下の通り。
manifest.json
window.html
todo.css
calculator-128.png
calculator-64.png
background.js
angular.min.js
controller.js
manifest.json とか background.js は Packaged Apps のお決まり。
アイコン作るのが面倒臭かったので前のサンプルアプリ(calculator-*.png)で使ったアイコンをそのまま流用。
今回重要なのは window.html, angular.min.js, controller.js だ。
manifest.json
{
"name": "TODO App",
"description": "My First Todo app.",
"version": "0.1",
"app": {
"background": {
"scripts": ["background.js"]
}
},
"icons": { "16": "calculator-16.png", "128": "calculator-128.png" }
}
background.js
chrome.app.runtime.onLaunched.addListener(function() {
chrome.app.window.create('window.html', {
'bounds': {
'width': 400,
'height': 500
}
});
});
まぁここまではお決まりということで。
ここからは重要。
window.html
<html ng-app ng-csp>
<head>
<script src="angular.min.js"></script>
<script src="controller.js"></script>
<link rel="stylesheet" href="todo.css">
</head>
<body>
<h2>Todo</h2>
<div ng-controller="TodoCtrl">
<span>{{remaining()}} of {{todos.length}} remaining</span>
[ <a href="" ng-click="archive()">archive</a> ]
<ul>
<li ng-repeat="todo in todos">
<input type="checkbox" ng-model="todo.done">
<span class="done-{{todo.done}}">{{todo.text}}</span>
</li>
</ul>
<form ng-submit="addTodo()">
<input type="text" ng-model="todoText" size="30"
placeholder="add new todo here">
<input class="btn-primary" type="submit" value="add">
</form>
</div>
</body>
</html>
ng-* なプロパティが AngularJS の重要箇所である。
次にスタイルシート。
todo.css
body {
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
}
ul {
list-style: none;
}
button, input[type=submit] {
background-color: #0074CC;
background-image: linear-gradient(top, #08C, #05C);
border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);
text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25);
color: white;
}
.done-true {
text-decoration: line-through;
color: grey;
}
そして最も重要といえるコントローラー。
controller.js
function TodoCtrl($scope) {
$scope.todos = [
{text:'learn angular', done:true},
{text:'build an angular Chrome packaged app', done:false}];
$scope.addTodo = function() {
$scope.todos.push({text:$scope.todoText, done:false});
$scope.todoText = '';
};
$scope.remaining = function() {
var count = 0;
angular.forEach($scope.todos, function(todo) {
count += todo.done ? 0 : 1;
});
return count;
};
$scope.archive = function() {
var oldTodos = $scope.todos;
$scope.todos = [];
angular.forEach(oldTodos, function(todo) {
if (!todo.done) $scope.todos.push(todo);
});
};
}
ソースを見ていくと、
まず、$scope.todos = [...] でModelのリストが初期値と共に定義され、次いで addTodo(), remaining(), archive() といった関数が定義されている。
View側の ng-model プロパティで定義された名前、例えば ng-model="todoText" が、controllerの中で $scope.todoText として利用される。
また、controller側で使われている $scope.todos というModelリストは、View側で以下のように利用される。
<li ng-repeat="todo in todos">
<input type="checkbox" ng-model="todo.done">
<span class="done-{{todo.done}}">{{todo.text}}</span>
</li>
todoの完了処理(done)を
<input type="checkbox" ng-model="todo.done">
だけで表現しているのは何気にすごいかも。普通ならcheckboxがクリックされたら todo.done=true してゴニョゴニョ、、、という面倒な処理を書く必要があろうかと思うが、このソースにはそれがどこにも見当たらない。HTMLだけで表現されているのだ。これは素晴らしい!
まとめると:
1. JavaScriptでコントロールを作成
例:function TodoCtrl($scope){...}
2. HTMLでコントロールを指定
例:<div ng-controller="TodoCtrl">
3. HTMLで使う
例1:<form ng-submit="addTodo()">
例2:{{ addTodo() }}
というわけで次回は画面遷移やフォームバリデーションとかサーバー通信なんかをやる予定。。。
参考
Create MVC - Google Chrome
Angular JS - Superheroic JavaScript MVW Framework
関連エントリ
【Chrome】Packaged Apps で OAuth2認証する超簡単なサンプル【Google】
【Chrome】Packaged Apps アプリをHelloWorld【Google】
スマホOSの主導権争いの行方