Backbone.js model.get() возвращает 'undefined', хотя я могу видеть атрибуты в console.log

У меня есть экземпляр модели, который я установил для другого экземпляра модели, т.е. model.set('rsvp', new App.Rsvp).

Когда я перебираю коллекцию для генерации списка из них в представлении, я получаю undefined при вызове model.rsvp.get('attending').

Но когда я делаю console.log(model.rsvp), я получаю следующее:

Rsvp
_changing: false
_escapedAttributes: Object
_moreChanges: false
_previousAttributes: Object
_setting: false
attributes: Object
    attending: true
    created_at: "2012-03-28T09:42:22-05:00"
    event_id: 20
    id: 12
    updated_at: "2012-03-28T09:42:22-05:00"
    user_id: 3
__proto__: Object
cid: "c53"
id: 12
__proto__: Rsvp

Итак, похоже, что с объектом нет проблемы, но get возвращает undefined.

Я должен признать, что мой навык Javascript по-прежнему довольно слабый. Что мне здесь не хватает?

Ответ 1

console.log( Object ) может обмануть вас. Он не покажет вам состояние Object в момент вызова console.log.

Отметьте jsFiddle и откройте консоль. Вы видите, как console.log показывает состояние Object в конце script, а не в момент вызова console.log.

Для более надежного информационного вызова console.log с более простыми значениями.

(проверено Chrome, Firefox и Safari на OSX)

Прочтите это для получения более подробной информации: Backbone.js Атрибут пустой матрицы

Ответ 2

Теоретически то, что вы делаете, должно работать, но, вероятно, не рекомендуется обходить атрибуты и хранить свойства непосредственно на экземплярах модели. Здесь jsfiddle, который показывает, что он работает в концепции. Я предполагаю, что ваш экземпляр модели восстанавливается из исходных данных через fetch в другом месте вашего кода, поэтому свойство model.rsvp исчезает. Это или model - это не тот экземпляр, который вы так думаете.

Ответ 3

model.rsvp = foo; (позволяет вызывать этот бит кода # 1), что эквивалентно model['rsvp'] = foo; не совпадает с model.set({'rsvp':foo}); (бит кода # 2). Если вы хотите привязать еще один экземпляр модели foo (или какой-либо другой объект или значение) к экземпляру модели model, используйте бит кода # 1 или его эквивалент. Если вы хотите добавить пару значений атрибута к экземпляру модели, который в конечном итоге может быть где-то навсегда сохранен, используйте бит кода # 2. Аналогично, вы будете иметь model.rsvp, если вы использовали model.rsvp = foo; или model['rsvp'] = foo;