1

sのコレクションを持っていTaskます。新しいインスタンスでコレクションのサブセットを返すために、コレクション宣言にいくつかのフィルター メソッドを追加しました。私がやりたいことは、元のコレクションにモデルを作成し、add(およびその他の) イベント フィルターをTasksコレクションの新しいインスタンスに絞り込んで、それに応じてビュー パーシャルを更新できるようにすることです。

これが私の問題を示すJSBinです。最後の行で元のコレクションに新しいモデルを追加すると、リストが更新されないことに注意してください。明らかに、フィルター メソッドがそのコレクションの新しいインスタンスを返すためです (これは私にはクリーンに見えます)。したがって、リスナーは起動されません。ビューは、アイテムが追加されたコレクションとは異なるコレクションを使用しています。

コレクションをセマンティックかつクリーンにフィルタリングしながら、返されたモデルのサブセットにバインドされたフィルタリング対象のセットにバインドされたイベントを保持するにはどうすればよいですか?

たとえば、次のコードのaddイベントは発生しません ( never は表示されません)。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