(function($, window, document, undefined){
// Taksモデル
var Task = Spine.Model.sub();
Task.configure('Task', 'task');
Task.extend(Spine.Model.Local);
// Tasksコントローラ
var Tasks = Spine.Controller.sub({
// 9. 初期生成要素のtag名を設定
tag: 'li',
render: function(){
// 10. テンプレートとレコードを元にhtmlを生成しel要素に挿入
this.el.html($('#mod-tmpl-list').tmpl(this.item));
return this;
}
});
// Appコントローラ
var App = Spine.Controller.sub({
// 3. 要素を設定
elements: {
'#mod-regist input': 'input',
'#mod-tasks ul': 'lists'
},
// 2. イベントを登録
events: {
'click button': 'create'
},
init: function(){
// 6. 新規レコードが作成されればaddメソッドを叩く
Task.bind('create', this.proxy(this.add));
// 12. onload時にfetchされればaddAllメソッドを叩く
Task.bind('refresh', this.proxy(this.addAll));
// 11. onload時にローカルストレージのデータを利用する
Task.fetch();
},
create: function(){
// 4. 空ならreturn
if(!this.input.val()) return;
// 5. 新規レコードを作成
var task = Task.create({
task: this.input.val()
});
},
add: function(task){
// 7. 新規ビューを作成
var view = new Tasks({
item: task
});
// 8. ビューをレンダリング
this.lists.append(view.render().el);
},
addAll: function(){
// 13. 全レコードをaddメソッドで処理
Task.each(this.proxy(this.add));
}
});
// DOMContentLoaded後に実行
$(function(){
// 1. Appコントローラを初期化
var app = new App({
el: $('#mod-app')
});
});
}(jQuery, window, this.document));
<script type="text/x-jquery-tmpl" id="mod-tmpl-list">
<span>${task}</span>
</script>
<div id="mod-app">
<header>
<h1>Todoアプリ</h1>
</header>
<div id="mod-regist">
<input type="text" placeholder="例:宿題をやる"><button>create</button>
</div>
<div id="mod-tasks">
<ul></ul>
</div>
</div>
External resources loaded into this fiddle: