2013-05-14 2 views
2

Я ищу способ из массивной коллекции получить некоторый массив из одного конкретного атрибута.Получить список конкретного атрибута из коллекции Backbone

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 на основе определенной предпосылки, то есть это не то, что я хочу. Идеи?

Благодаря

ответ

3

Если вы хотите только один атрибут, вы можете использовать _.pluck

SomeCollection.pluck('attr3'); 

Для нескольких атрибутов, вы можете объединить _.map по коллекциям и _.pick на моделях

SomeCollection.map(function (model) { 
    return model.pick('attr2', 'attr3'); 
}); 

и А demo http://jsfiddle.net/nikoshr/qpyXc/1/

Или, для более краткой версии с использованием _.invoke

SomeCollection.invoke('pick', 'attr2', 'attr3'); 

http://jsfiddle.net/nikoshr/qpyXc/3/

+0

Именно то, что я ищу! Спасибо! –

1

Я думаю, что вы хотите Подчеркивание-х pluck:

Удобный вариант того, что является, пожалуй, наиболее распространенный вариант использования для карты: извлечение списка значений свойств.

var attrs = _.pluck(someCollection.models, 'attr3'); 
+0

Большое спасибо, pluck было то, что я искал! –

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 (массив, ATTRIBUTENAME) доступен также вне контекста Backbone и работает на массивов, а не коллекции. Внутри, collection.pluck вызывает _.pluck (collection.models, fieldName).

+0

Спасибо, это была часть, которую я искал, я оставил экземплярную часть моделей и коллекцию для простоты в вопросе. –

0
someCollection.pluck.call({ 
    models: someCollection.where({ 
     attribute_name:attribute_value 
    }) 
}, attribute_val_to_fetch); 
Смежные вопросы