我有一个Task
s 的集合。我在集合声明中添加了一些过滤器方法,以在新实例中返回集合的子集。我想要做的是在原始集合中创建一个模型,并将add
(和任何其他)事件过滤到Tasks
集合的任何新实例,以便我的视图部分可以相应地更新。
这是一个 JSBin 演示我的问题。请注意,当我在最后一行的原始集合中添加新模型时,列表不会更新,因为很明显,过滤器方法会返回该集合的新实例(对我来说似乎很干净),因此不会触发任何侦听器 -该视图使用的集合与已添加项目的集合不同。
如何在语义上和干净地过滤集合,但将绑定到被过滤集合的任何事件绑定在返回的模型子集上?
例如,对于以下代码(从不显示)不会触发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 });
我怎样才能解决这个问题?理想情况下,我不想存储集合的原始状态,返回一个子集,然后再次恢复所有模型。