_.puck коллекции Backbone не работает

У меня есть эта модель -

class pt.SearchResultModel extends Backbone.Model
  defaults:
    id:"",
    image:"",
    colour:""

Я пытаюсь это -

_.pluck(resultsCollection,'id')

Но он продолжает возвращаться undefined - не знаю, что происходит.

Какую синтаксическую ошибку я делаю?


person praks5432    schedule 13.09.2012    source источник


Ответы (5)


Методы массива Underscore встроены (так сказать) в коллекции Backbone. Вы можете вызвать их прямо на них:

resultsCollection.pluck 'id'

В большинстве случаев вы также можете использовать методы подчеркивания для атрибута коллекции models (который представляет собой обычный массив), например _.pluck someCollection.models, 'someAttr', но обратите внимание, что случай pluck особенный, поскольку модели Backbone обычно не имеют своих атрибутов, как собственные свойства (для доступа к ним необходимо вызвать get). Реализация pluck в Backbone, тем не менее, очень проста :)

person epidemian    schedule 13.09.2012

Как уже упоминалось, вы можете напрямую использовать метод pluck вашей коллекции, который делегирует подчеркивание < метод href="http://documentcloud.github.com/underscore/#pluck" rel="nofollow">pluck.

Однако я заметил, что если, например, вы отфильтруете свою коллекцию, вы получите простой массив моделей и поэтому не имеют метода pluck коллекции. В этом случае вы можете сначала выбрать атрибут attributes, а затем выбрать id, например, что-то вроде этого должно работать

_.pluck(_.pluck(myCollection, 'attributes'), 'id');

Конечно, вы также можете просто создать новую коллекцию и передать эти модели, а затем получить доступ к методу коллекций pluck.

person Jack    schedule 13.09.2012

Так должно быть:

resultsCollection.pluck('id');

Методы подчеркивания в коллекциях Backbone используются таким образом, а не в исходной форме _.method()

person Ingro    schedule 13.09.2012

Backbone.Collection автоматически предоставляет значительную часть underscore.js функций. Так что вы можете написать resultsCollection.pluck('id'), что немного лучше.

Теперь о вашем вопросе: pluck использует «get» внутри для получения ваших атрибутов. Это, а также ваш результат означает, что ваша модель не имеет id, определенного как атрибут.

person ksol    schedule 13.09.2012

Когда вы вызываете _.pluck(resultsCollection,'id'), вы вызываете метод pluck для объекта коллекции. В этой коллекции есть атрибут models, но нет атрибута id.

Вот почему гораздо лучше вызвать resultsCollection.pluck('id'), который сделает всю работу за вас:

  • перейдите к атрибуту models
  • перейти к каждому атрибуту attributes каждой модели
  • найти нужное значение id и поместить его в массив результатов
person Nicolas Zozol    schedule 14.09.2012