集合添加事件在两个独立的集合上触发
Collection add event fires on two independent Collections
我的Todos App试图通过添加一些额外的功能来理解backbone.js(Todos App)框架的内部,在两个集合上触发了一个collection.add事件,原始的TodoList和我自己的UnsavedList
这就是我所做的:
通过_模板向文档添加"标记全部完成"按钮,该按钮可选中所有未选中的复选框,而不会将更改保存到服务器。
通过_.template.向文档添加"保存({未保存的集合长度})"按钮
为了实现这一点,我跟踪TodoList中所有模型的"savedState"
// 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;
与原始示例一样,add事件绑定到addOne处理程序。
// inside AppView
...
initialize: function() {
Todos.bind('add', this.addOne);
...
}
点击"Mark All Done"按钮调用markAllDone,进而触发"change:allDone":
// inside AppView
markAllDone: function() {
Todos.each(function(todo) {
todo.set({ done: true });
})
Todos.trigger('change:allDone');
},
和"change: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。
想法?
尽管我本可以使用{silent:true}选项,但我对这种行为太好奇了,我发现自己在查看源代码:
每次将模型添加到集合中时,模型本身都会触发添加事件。在我的情况下,TodoList和UnsavedList都在监听"添加"
以下是从backbone.js:截取的代码
// inside _add
if (!options.silent) model.trigger('add', model, this, options);
为了绕过这一点(我想我想保持我的事件流),我只存储了一个模型的克隆副本,如下所示:
UnsavedTodos.add(_.clone(todo), { silent: false });
我相信使用嵌套集合或任何处理同一模型的方法来实现这一点要容易得多,而不是克隆。我通过每次保存、创建或销毁后触发的事件来跟踪我未保存(克隆)的模型。
这是我完成的修改Todos应用
- 如何使jQuery插件函数可调用以供独立使用,而不在集合上操作
- Meteor-将选定窗体中的对象添加到集合中
- 主干集合重置和解析
- 定义完全独立的样式信息
- 如何更改reactjs中外部/独立组件的状态或属性
- 使用数据上的角度更改设置集合的第一个元素的动画
- 为集合分配大量的模型弹药
- 如何使用backbone.js从集合中获取模型名称
- Lodash从集合创建集合
- 2个backbone.js集合,具有相同的模型,但排序顺序不同
- 如何合并不同集合的游标并按日期排序
- 将当前用户的 ID 推送到 meteorjs 中集合/文档的内部数组
- 使用它更新集合中的嵌套数组's索引
- 主干-从模板中迭代的集合中获取特定的模型
- 微风得到的是实体而不是对象的集合
- 用独立变量敲除foreach绑定
- Meteor:插入集合后如何执行JS
- DataTables合并了两个独立表中的jQuery/Javascript函数
- Meteor如何独立于包提供的助手使用blog_posts集合
- 集合添加事件在两个独立的集合上触发