はじめに
前回の続きです。
var AppView = Backbone.View.extend({ el: $("#todoapp"), statsTemplate: _.template($('#stats-template').html()), events: { "keypress #new-todo": "createOnEnter", "click #clear-completed": "clearCompleted", "click #toggle-all": "toggleAllComplete" }, initialize: function(){ this.input = this.$("#new-todo"); this.allCheckbox = this.$("#toggle-all")[0]; this.listenTo(Todos, 'add', this.addOne); this.listenTo(Todos, 'reset', this.addAll); this.listenTo(Todos, 'all', this.render); this.footer = this.$('footer'); this.main = $('#main') Todos.fetch(); }, render: function(){ var done = Todos.done().length; var remaining = Todos.remaining().length; if(Todos.length){ this.main.show(); this.footer.show(); this.footer.html(this.statsTemplate({done: done, remaining: remaining})); } else{ this.main.hide(); this.footer.hide(); } this.allCheckbox.checked = !remaining; }, addOne: function(todo){ var view = new TodoView({mode: todo}); this.$("#todo-list").append(view.render().el); }, addAll: function(){ Todos.each(this.addOne, this); }, createOnEnter: function(e){ if(e.keyCode != 13) return; if(!this.input.val()) return; Todos.create({title: this.input.val()}); this.input.val(''); }, clearCompleted: function(){ _.invoke(Todos.done(), 'destroy'); return false; }, toggleAllComplete: function(){ var done = this.allCheckbox.checked; Todos.each(function(todo){ todo.save({'done':done}); }); } }); var App = new AppView;
コード解説
el: $(“#todoapp”),
elにJQueryオブジェクトを指定しています。前回のliタグのViewクラスと違い、既に存在しているDOMノードを指定しています。
statsTemplate: _.template($(‘#stats-template’).html()),
Underscore.jsのtemplateメソッドです。scriptタグ内に記述してあるHTML文字列をテンプレートとして利用します。
events: {
“keypress #new-todo”: “createOnEnter”,
“click #clear-completed”: “clearCompleted”,
“click #toggle-all”: “toggleAllComplete”
},
イベント定義です。
initialize: function(){
this.input = this.$(“#new-todo”);
this.allCheckbox = this.$(“#toggle-all”)[0];
this.listenTo(Todos, 'add', this.addOne);
this.listenTo(Todos, 'reset', this.addAll);
this.listenTo(Todos, 'all', this.render);
this.footer = this.$('footer');
this.main = $('#main')
Todos.fetch();
},
このビューの初期化処理です。
TodoのコレクションであるTodosのイベントをサブスクリプションします。Todos.fetch();
が実行されるとTodosにTodoが格納されてresetイベントが発火しaddAllがコールされて全てのTodoが描画されます。
render: function(){
var done = Todos.done().length;
var remaining = Todos.remaining().length;
if(Todos.length){
this.main.show();
this.footer.show();
this.footer.html(this.statsTemplate({done: done, remaining: remaining}));
}
else{
this.main.hide();
this.footer.hide();
}
this.allCheckbox.checked = !remaining;
},
描画メソッドです。Todosの状態によってUIを制御します。
addOne: function(todo){
var view = new TodoView({mode: todo});
this.$(“#todo-list”).append(view.render().el);
},
addAll: function(){
Todos.each(this.addOne, this);
},
createOnEnter: function(e){
if(e.keyCode != 13) return;
if(!this.input.val()) return;
Todos.create({title: this.input.val()});
this.input.val('');
},
clearCompleted: function(){
_.invoke(Todos.done(), 'destroy');
return false;
},
toggleAllComplete: function(){
var done = this.allCheckbox.checked;
Todos.each(function(todo){
todo.save({'done':done});
});
}
各イベントから呼ばれる処理群です。内容は見ればなんとなく分かると思います。
以上でTodosのコードは終わりです。起点となるビュー(AppView)があり、そこからビュー、コレクション、モデルを利用している構成であることが分かります。
次はrouterやmodelをデータストアと同期するBackbone.sync()について見ていこうと思います。