所以我在Backbone中有一个集合来获取事件列表。这个集合有一个方法,它根据传递给它的类别列表过滤列表。
var Events = Backbone.Collection.extend({
model: Event,
url: settings.events_url,
filtered: function(checked) {
return this.filter(function(e) {
if ($.inArray(e.get('category').name, checked) >= 0) {
return true;
} else {
return false;
}
});
}
});
我需要做的是将此过滤后的集合转换为JSON,就像整个集合一样。
var events = new Events();
events.toJSON();
但是,由于过滤后的集合不再是实际集合,而是模型列表,因此我没有.toJSON()方法可用。有没有办法将我过滤的集合转换为真正的集合?或者有更简单的方法将其转换为JSON吗?
谢谢!
答案 0 :(得分:3)
constructor for a collection可以将模型列表作为参数,所以:
var events = new Events();
var filteredEvents = new Events(events.filtered(true));
console.log(filteredEvents.toJSON());
答案 1 :(得分:2)
为什么不使用标准API?
var checked = ['foo', 'bar', 'baz'],
filtered = eventsCollection
.chain()
.filter(function(model) {
return _.include(checked, model.get('category').name);
})
.invoke('toJSON')
.value();
另外,Events.filterByCategoryName
方法名称更明确。但是,我倾向于在我的设计中实现太多“方便”的方法,并直接使用标准API。
答案 2 :(得分:1)
您也可以尝试以下方式:
filtered: function(checked) {
return _.map(this.filter(function(e) {
return $.inArray(e.get('category').name, checked) >= 0
}), function(model) {
return model.toJSON();
});
}
从内到外:
答案 3 :(得分:0)
你可以这样做:
var myFilteredCollection = new Events();
_.each(myFilteredData, function(eventModel){
myFilteredCollection.add(eventModel);
});
myFilteredCollection.toJSON();
答案 4 :(得分:0)
我解决它的方法是在集合上运行reduce
函数。这样做的好处是,您只对集合本身进行1次传递,仅记住有效模型,并在模型通过验证时返回模型的JSON。
其他解决方案提供了建立一个性能明智的新系列 - 可怕。
getValidItems: function () {
//return only valid items as json
return this.collection.reduce(function (validItems, row) {
if (row.isValid()) {
validItems.push(row.toJSON());
}
return validItems;
}, []);
},
//somewhere where you save
save: function() {
var validItems = this.getValidItems();
//do something with valid items
}