1

我有一个Tasks 的集合。我在集合声明中添加了一些过滤器方法,以在新实例中返回集合的子集。我想要做的是在原始集合中创建一个模型,并将add(和任何其他)事件过滤到Tasks集合的任何新实例,以便我的视图部分可以相应地更新。

这是一个 JSBin 演示我的问题。请注意,当我在最后一行的原始集合中添加新模型时,列表不会更新,因为很明显,过滤器方法会返回该集合的新实例(对我来说似乎很干净),因此不会触发任何侦听器 -该视图使用的集合与已添加项目的集合不同。

如何在语义上和干净地过滤集合,但将绑定到被过滤集合的任何事件绑定在返回的模型子集上?

例如,对于以下代码(从不显示)不会触发add事件:notAsManyTasksalert()

// 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 });

我怎样才能解决这个问题?理想情况下,我不想存储集合的原始状态,返回一个子集,然后再次恢复所有模型。

4

1 回答 1

1

在不做一些复杂的事情的情况下,你应该能够按照这些思路做一些事情:

mySubset.listenTo(myCollection, 'all', function() {
  this.trigger.apply(this, arguments);
});

您收听集合中的所有事件,并将它们与您的子集相呼应。尽管我猜这只是解决方案的一半,因为您的子集不会更新,并且您会在侦听器中为所有子集进行过滤。
另一种只做一次工作的解决方案是让你的集合监听它自己的add事件,过滤新模型,并触发一个自定义事件,这样只有真正需要做某事的子集才能做某事。

于 2013-06-01T01:49:33.777 回答