通过添加一些额外的功能来了解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。
想法?