通過添加一些額外的功能來了解backbone.js(Todos App)框架的內部,我的Todos App在兩個集合,原始TodoList和我自己的觸發器上觸發collection.add事件UnsavedListCollection添加事件觸發兩個獨立的集合
這是我做過什麼:
添加一個「馬克完成」按鈕來記錄槽_.template,檢查所有選中的複選框,而不更改保存到服務器。
將'Save({unsaved collection length})'按鈕添加到文檔槽_.template。
要做到這一點,我跟蹤所有型號的「savedState」的TodoList的
// inside TodoList
hasUnsaved: function() {
return this.filter(function(todo) {
var isEqual = _.isEqual(todo.savedAttributes, todo.attributes);
return !isEqual;
})
},
聲明和實例UnsavedList:
// inside window
window.UnsavedList = Backbone.Collection.extend({
model: Todo,
initialize: function() {
this.bind('add', this.addHandler)
},
addHandler: function() {
alert('added')
}
});
window.UnsavedTodos = new UnsavedList;
作爲原始樣品中,添加事件勢必要增加一個Handler。
// inside AppView
...
initialize: function() {
Todos.bind('add', this.addOne);
...
}
偵聽到 '馬克完成' 按鈕點擊調用markAllDone這反過來又觸發 '的變化:allDone':
// inside AppView
markAllDone: function() {
Todos.each(function(todo) {
todo.set({ done: true });
})
Todos.trigger('change:allDone');
},
...和 '變化:allDone' 所調用:
// inside AppView
checkSaved: function() {
this.$('#todo-controls #button-saved').html(this.buttonSavedTemplate({
saved: function() {
var list = Todos.hasUnsaved();
_.each(list, function(todo) {
UnsavedTodos.add(todo);
})
return list.length;
}
}));
},
如果你看看我的模板對象的迭代器,我將所有未保存的模型添加到我的UnsavedList中。但奇怪的是,TodoList還監聽這個確切的「添加」事件,所有未保存的模型都顯示在頁面上。
爲什麼這麼說,即使很難我只是'添加'到UnsavedList。
想法?