我正在通过_.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 });