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;