【发布时间】:2012-03-23 13:03:49
【问题描述】:
我有 Backbone.js 集合,其中包含(例如)30 个项目。
我想传递给我的模板过滤集合,其中包含原始集合中的每 3 个项目。
有谁知道如何优雅地完成它?首选 CoffeeScript 代码。
【问题讨论】:
标签: collections filter backbone.js coffeescript
我有 Backbone.js 集合,其中包含(例如)30 个项目。
我想传递给我的模板过滤集合,其中包含原始集合中的每 3 个项目。
有谁知道如何优雅地完成它?首选 CoffeeScript 代码。
【问题讨论】:
标签: collections filter backbone.js coffeescript
这里假设originalCollection 是您现有的收藏
var newCollection = new Backbone.Collection();
for (var i = 0, l = originalCollection.length; i < l; i++) {
if (i % 3 === 0) { newCollection.add(originalCollection.models[i]); }
}
此代码通过循环遍历每个现有模型来工作,并且仅当模型的索引是 3 的倍数时才将模型添加到新集合中。
您可以通过使用 Underscore.js 在 Backbone Collections 中公开的下划线 each 方法来使它更好一点:
var newCollection = new Backbone.Collection();
originalCollection.each(function (model, index) {
if (index % 3 === 0) { newCollection.add(model); }
});
将以上内容转换为 CoffeeScript 会导致:
newCollection = new Backbone.Collection()
originalCollection.each (model, index) ->
newCollection.add model if index % 3 is 0
【讨论】:
Backbone 集合中混入了一些有用的Underscore methods。您可以使用filter 获取可以传递给模板的模型数组:
filteredModels = collection.filter (model, i) -> i % 3 == 0
或者,您可以使用数组推导;虽然我认为这不太可读......
filteredModels = (model for model, i in collection.models when i % 3 == 0)
如果您真的需要模板中的 Backbone.Collection,您可以使用这些过滤后的模型创建一个新的:
filteredCollection = new Backbone.Collection filteredModels
Here 是一个有效的 jsfiddle 示例。
【讨论】: