Магистральный/подпоточный метод с использованием метода - программирование

Магистральный/подпоточный метод с использованием метода

Там должно быть что-то простое, я здесь отсутствует.

http://jsfiddle.net/v9mdZ/

Я просто изучаю Backbone и Underscore/loDash и пытаюсь познакомиться с chain.

У меня есть следующий код, который работает как ожидалось:

var ids = _.pluck(collection.where({'is_checked':true}), 'id');

Я попытался реорганизовать это, используя chain следующим образом:

var ids = collection.chain().where({'is_checked':true}).pluck('id').value();

Почему не работает реорганизованный код? Я использую chain неправильно?

Решение (подробнее см. ниже)

Не используйте where с chain.

4b9b3361

Ответ 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], который вы ищете.

Демо: http://jsfiddle.net/ambiguous/kRmaD/