Ответ 1
Слияние некоторых методов Подчеркивания в коллекции немного несовершенно. Когда вы говорите collection.some_mixed_in_underscore_method()
, коллекция распаковывает некоторые элементы Backbone за спиной, чтобы метод Underscore применялся к атрибутам внутри моделей коллекций; это вроде как:
var ary = _(this.models).map(function(m) { return m.attributes });
return _(ary).some_mixed_in_underscore_method();
Но collection.chain()
не работает так, chain
просто обертывает коллекцию models
, поэтому, если вы это сделаете:
console.log(collection.chain());
вы увидите, что chain
предоставляет вам объект, который обертывает массив моделей. У ваших моделей не будет свойства is_checked
(т.е. Нет model.is_checked
), они будут иметь атрибуты is_checked
(т.е. Будут model.get('is_checked')
и model.attributes.is_checked
).
Теперь мы видим, где все идет не так:
collection.chain().where({'is_checked':true})
Модели не имеют свойств is_checked
. В частности, не будет моделей, где is_checked
есть true
, и все после where
работает с пустым массивом.
Теперь, когда мы знаем, где дела идут боком, как мы это исправим? Ну, вы можете использовать filter
вместо where
, чтобы вы могли легко распаковать модели:
collection.chain()
.filter(function(m) { return m.get('is_checked') })
.pluck('id')
.value();
Но ваши модели не имеют id
, но вы не создали их с помощью id
, и вы не разговаривали с сервером, чтобы получить id
, чтобы вы получили массив undefined
назад. Если вы добавите несколько id
s:
var collection = new App.OptionCollection([
{id: 1, 'is_checked': true},
{id: 2, 'is_checked': true},
{id: 3, 'is_checked': false}
]);
то вы получите [1,2]
, который вы ищете.