Backboneシリーズ:todoのデモ
5269 ワード
概要
todoの考えは、Modelは各todo項のモデルとして、そして各todo Viewと一つのTodo Viewと関連しています.最後にAppViewでtodo全体の変更をモニターし、対応するイベントをトリガします.
簡単なデモ
ステップ1
まず簡単に機能を追加するだけのtodoから始めます.
データ保存に協力する
BackboneがカスタマイズしたBackbone.syncはモデルまたは集合した状態を可能にします.
持続的にサーバ端に同期します.ここでは、私達は異なる耐久性の方式で、つまりlocal Strageでデータをローカルに保存します.私達が必要なのは、Collectionでlocastrage属性を定義するだけです.
インタラクティブ機能を豊富にするモデルとビューの作成:初期化時に保存されたtodo項を自動的にロードし、一方向にTodo項の数とビューを結合し、重要な点はAppViewである.デモ AppViewビュー初期化時に、セットのfetch()メソッドを呼び出して、格納されたデータをロードする . fetch()方法でtodoのモデルデータを取得すると、自動的にセットに追加され、セットの「add」イベントがトリガされ、todo項に対応するビュー がレンダリングされる.モデルがセットに追加されると、「all」イベントもトリガされます.ここでtodoエントリ数統計のビュー を更新することができます.
モデルとビューの削除:todoプロジェクトのクリアとすべてのクリアを監督し、ビューTodoView上の対応方法を呼び出してDOMを削除します.ポイントはTodoView上のイベントのモニターの定義です.デモ TodoViewでdestroyボタンのクリックイベントを傍受し、TodoViewにmodestoryイベントを傍受させます. destoryをクリックしたときにmodelのdestory()を呼び出し、セット内のモデルを削除し、ビューのremove方法を呼び出してDOM を削除する. AppViewで削除されたすべてのボタンを傍受し、_.invoke()メソッドは、すべての状態が完了したtodo項 を削除する.
モデルとビューの更新:modelを更新した後、save方法を使ってモデルを更新することができます.デモ TodoViewでバインドされたダブルクリックイベントは、ダブルクリックした後に変更された内容 を許可する.は、焦点を失った後にモデルを更新する .
はルート上で傍受し、collectionのfilterイベントをトリガし、viewはcollectionのイベントを傍受し、ビューdemo を更新する.
todoの考えは、Modelは各todo項のモデルとして、そして各todo Viewと一つのTodo Viewと関連しています.最後にAppViewでtodo全体の変更をモニターし、対応するイベントをトリガします.
簡単なデモ
ステップ1
まず簡単に機能を追加するだけのtodoから始めます.
var Todo = Backbone.Model.extend({
// , Collection create ,
defaults: {
title: 'todo ',
done: false
}
});
var TodoList = Backbone.Collection.extend({
// !
model: Todo
});
var todolist = new TodoList();
var TodoView = Backbone.View.extend({
tagName: 'li',
template: _.template($('#item-template').html()),
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
}
});
var AppView = Backbone.View.extend({
el: $('#todoapp'),
events: {
'keypress #new-todo': 'create'
},
initialize: function () {
this.input = $('#new-todo');
// add API :'add'(model, collectoin, options)
// model
this.listenTo(this.collection, 'add', this.addOne);
},
create: function(e) {
if (e.keyCode != 13 || !this.input.val()) {
return false;
}
this.collection.add({
title: this.input.val(),
// create , done
done: false
});
this.input.val('');
},
addOne: function (todo) {
var view = new TodoView({model: todo});
// $el el , append jquery htmlElement
$("#todo-list").append(view.render().el);
}
});
var app = new AppView({collection: todolist});
は全部で4つのモジュールに分けられています.各todo項に対応するモデル(TodoView)とビュー(Todo View)は、複数のtodo項のセット(TodoList)を一括して保存し、変更を傍受するためのビュー(ApView)を備えています.データ保存に協力する
BackboneがカスタマイズしたBackbone.syncはモデルまたは集合した状態を可能にします.
持続的にサーバ端に同期します.ここでは、私達は異なる耐久性の方式で、つまりlocal Strageでデータをローカルに保存します.私達が必要なのは、Collectionでlocastrage属性を定義するだけです.
localStorage: new Backbone.LocalStorage("todos-backbone")
その後、私達はcreateとsaveなどの方法を使ってデータを現地に保存し、addイベントをトリガし、モデルの新規と保存を完成することができます.インタラクティブ機能を豊富にする
var AppView = Backbone.View.extend({
el: $('#todoapp'),
statsTemplate: _.template($('#stats-template').html()),
events: {
'keypress #new-todo': 'create'
},
initialize: function () {
this.input = $('#new-todo');
// add API :'add'(model, collectoin, options)
// model
this.listenTo(this.collection, 'add', this.addOne);
this.listenTo(this.collection, 'all', this.render);
this.footer = this.$('footer');
this.main = $('#main');
// , set
// set add , addOne ,
this.collection.fetch();
},
render: function () {
// , todo
var done = this.collection.getDone().length;
var remaining = this.collection.getRemaining().length;
if (this.collection.length) {
this.main.show();
this.footer.show();
this.footer.html(this.statsTemplate({
done: done,
remaining: remaining
}));
}
else {
this.main.hide();
this.footer.hide();
}
},
create: function(e) {
if (e.keyCode != 13 || !this.input.val()) {
return false;
}
this.collection.add({
title: this.input.val(),
// create , done
done: false
});
this.input.val('');
},
addOne: function (todo) {
var view = new TodoView({model: todo});
// $el el , append jquery htmlElement
$("#todo-list").append(view.render().el);
}
});
var TodoView = Backbone.View.extend({
tagName: 'li',
template: _.template($('#item-template').html()),
events: {
'click .toggle': 'toggleDone',
'click a.destroy': 'clear'
},
initialize: function() {
// model destory , remove , DOM
this.listenTo(this.model, 'destroy', this.remove);
},
render: function() {
this.$el.html(this.template(this.model.toJSON()));
return this;
},
toggleDone: function() {
// app , todo view model
this.model.toggle();
},
clear: function() {
this.model.destroy();
}
});
var Router = Backbone.Router.extend({
routes: {
'*filter': 'setFilter'
},
setFilter: function(param) {
state = param || '';
todolist.trigger('filter');
}
});
var router = new Router();
Backbone.history.start();