我正在寻找一种方法,从骨干集合中检索某种特定属性的某种数组。
var SomeModel = Backbone.Model.extend({
defaults: function() {
return {
attr1: "something",
attr2: "something",
attr3: "darkside"
};
}
});
var SomeCollection = Backbone.Collection.extend({
model: SomeModel,
url: '/data.json',
});
现在假设我有类似上面的东西,我只想要一个只有属性' attr3'的集合/数组/类似物。有没有很好的方法来获得这个(不是通过手动迭代SomeCollection和构建一个新的集合)?我对下划线功能的理解"过滤"是它根据某个前提返回整个SomeModel,即这不是我想要的。想法?
谢谢
答案 0 :(得分:4)
如果您只想要一个属性,则可以使用_.pluck
SomeCollection.pluck('attr3');
对于多个属性,您可以在集合上合并_.map,在模型上合并_.pick
SomeCollection.map(function (model) {
return model.pick('attr2', 'attr3');
});
演示http://jsfiddle.net/nikoshr/qpyXc/1/
或者,对于使用_.invoke
SomeCollection.invoke('pick', 'attr2', 'attr3');
答案 1 :(得分:1)
我想你想要Underscore的pluck:
可能是最常见的用例的便捷版本 map:提取属性值列表。
var attrs = _.pluck(someCollection.models, 'attr3');
答案 2 :(得分:1)
我认为这里存在一些误解。在您发布的代码中,您为新创建的模型设置了默认属性。通过以下方式创建的任何模型:
var model = new SomeModel({});
或:
var collection = new SomeCollection();
// Add to collection
collection.add({});
// Add to collection AND sync with server
collection.create({});
将这些属性设置为给定值,因为您没有在传递给上述函数的哈希中对它们进行不同的定义。
相反,我认为你要求这个:
// Create some models
var model_a = new SomeModel({attr1: "Alpha"});
var model_b = new SomeModel({attr1: "Beta"});
var model_c = new SomeModel({attr1: "Gamma"});
// Push them in the collection
var collection = new SomeCollection([model_a, model_b, model_c]);
然后,您可以获得包含所请求模型属性值的字符串数组:
collection.pluck(attributeName);
这本身就是一个继承自Underscore.js的函数,Backbone依赖它。
我指定这一点以明确_.pluck(array,attributeName)也可用于外部 Backbone上下文并适用于数组,而不是集合。在内部,collection.pluck调用_.pluck(collection.models,fieldName)。
答案 3 :(得分:0)
someCollection.pluck.call({
models: someCollection.where({
attribute_name:attribute_value
})
}, attribute_val_to_fetch);