我有Task
秒的集合。我在集合声明中添加了一些过滤方法,以便在新实例中返回集合的一个子集。我想要做的是在原始集合中创建一个模型,并将add
(和任何其他)事件筛选到Tasks
集合的任何新实例,以便我的查看部分可以相应地更新。复制事件,以新的实例
Here is a JSBin demonstrating my problem。请注意,当我在最后一行的原始集合中添加新模型时,列表不会更新,因为显然,筛选器方法会返回该集合的新实例(这对我来说似乎很干净),因此任何侦听器都不会被触发 - 该视图使用与添加了项目的视图不同的集合。
我如何语义和干净筛选集合,但保持势必被过滤设定的约束对模型的子集返回的任何事件?
例如,不烧成下面的代码的add
事件notAsManyTasks
(在alert()
从来没有显示):
// Task model
var Task = Backbone.Model.extend();
// Tasks collection
var TasksCollection = Backbone.Collection.extend({
model: Task,
byProject: function(projectId) {
var matches = this.filter(function(task) {
return task.get('projectId') == projectId;
});
return new TasksCollection(matches);
},
complete: function(state) {
return new TasksCollection(this.where({ complete: state }));
}
});
// Example collection
var lotsOfTasks = new TasksCollection([
{ id: 1, projectId: 1, complete: false },
{ id: 2, projectId: 1, complete: true },
{ id: 3, projectId: 2, complete: false },
{ id: 4, projectId: 2, complete: true }
]);
var notAsManyTasks = lotsOfTasks.byProject(1);
notAsManyTasks.on('add', function() {
alert("Added");
});
// Does not fire `add` event on `notAsManyTasks` which is my problem, however
// it _does_ fire on `lotsOfTasks`, as it should
lotsOfTasks.add({ id: 5, projectId: 1, complete: false });
我如何克服这个问题?理想情况下,我不想存储集合的原始状态,返回一个子集,然后再次恢复所有模型。
所以你想要一个更新的原始集合的视图?当你执行'notAsManyTasks.add({id:6,projectId:1,complete:true})'时,你想要发生什么? – Eric
理想情况下,它应该在'lotsOfTasks'之间同步,因为'notAsManyTasks'是前者的“孩子”(子集)。不过,我不在乎,因为我总是可以做'lotsOfTasks.add(...)' – Bojangles