0

我正在通过_.each()循环运行它来过滤 Backbone 集合,如果它们不符合某些条件,则删除它们。

出于某种原因,循环总是在过滤了大约一半的集合后停止。

我有两个理论:

  • 我注意到循环总是在集合中最后一个位置的项目上结束。也许项目以随机顺序传递给循环,但循环引用集合的“实际”顺序。

  • 通过从被过滤的同一个集合中删除项目,我搞砸了循环,它认为项目比实际少。

这是一个工作版本:http: //jsfiddle.net/aZ9zJ/。有人可以告诉我发生了什么事吗?

--

顺便说一句,我知道过滤函数_.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 回答