0

バックボーン コレクションを_.each()ループで実行し、特定の条件に合わない場合はアイテムを削除してフィルタリングしています。

何らかの理由で、コレクションの約半分をフィルタリングした後、ループは常に停止します。

私には2つの理論があります:

  • ループは常にコレクションの最後に配置されたアイテムで終了することに気付きました。アイテムがランダムな順序でループに渡される可能性がありますが、ループはコレクションの「実際の」順序を参照しています。

  • フィルタリングされている同じコレクションからアイテムを削除すると、ループが台無しになり、実際よりもアイテムが少ないと考えられます。

ここに作業バージョンがあります: http://jsfiddle.net/aZ9zJ/。誰かが私に何が起こっているのか教えてもらえますか?

--

ところで、 and のようなフィルタリング関数については知っています_.filter()_.where()、コレクションではなく配列を返すため、それらは避けたいと思っています。

代わりにフィルタリング機能に切り替えることはできますが、私が試している each/remove 手法が機能しない理由を理解したいと思っています。

App.View.Items = Backbone.View.extend({
    tagName: 'p',

    initialize: function() {
        Backbone.on('filter:now', this.filterItems, this);

        this.filtered = new Backbone.Collection;

        this.collection.each(function(item) {
            this.filtered.add(item);
        }, this);

        this.filters = new Backbone.Collection([
            {
                property: 'director',
                criteria: 'Orson Welles'
            }
        ]);

        Backbone.trigger('filter:now');
    },

    filterItems: function() {
        this.filters.each(function(filter) {
            this.filtered.each(function(item) {
                if ( item.get(filter.get('property')) === filter.get('criteria') ) {
                    this.filtered.remove(item);
                }
            }, this);
        }, this);

        console.log(this.filtered);
    }

});

フィルタリングされていないコレクション:

var itemCollection = new App.Collection.Items([
    {
        title: 'Citizen Kane',
        director: 'Orson Welles'
    },
    {
        title: 'Touch of Evil',
        director: 'Orson Welles'
    },
    {
        title: 'The Third Man',
        director: 'Orson Welles'
    },
    {
        title: 'Jaws',
        director: 'Steven Spielberg'
    },
    {
        title: 'Magnificent Ambersons',
        director: 'Orson Welles'
    }
]);

ビューのインスタンス化:

var itemsView = new App.View.Items({ collection: itemCollection });
4

1 に答える 1

1

ところで、_.filter() や _.where() などのフィルタリング関数については知っていますが、それらはコレクションではなく配列を返すため、それらを避けることを好みます。

しかし、それでもそれらを使用する必要があります。

フィルタリングされているコレクションをいじると、その長さが変わるため、結果が予測できない場合があります。filterコレクションを作成setしてから、他のコレクションでこの操作から返された配列を取得する必要があります。

this.filtered.set( this.collection.filter(function(item) {
            return item.get(filter.get('property')) === filter.get('criteria');
            }
))

http://jsfiddle.net/aZ9zJ/1/

于 2013-09-20T07:06:27.177 に答える