我有一个模型实例,我在其上设置了另一个模型实例,即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技能仍然很弱。我在这里缺少什么?
答案 0 :(得分:18)
console.log( Object )
可以欺骗你。在调用Object
时,它不会向您显示console.log
的状态。
选中此jsFiddle并打开控制台。您了解console.log
如何在脚本末尾显示Object
的状态,而不是console.log
来电时的状态。
要获得更可靠的信息,请使用更简单的值调用console.log
。
(通过OSX测试Chrome,Firefox和Safari)
阅读本文以获取更多详细信息:Backbone.js Empty Array Attribute
答案 1 :(得分:0)
理论上你正在做的事情应该有效,但是直接在模型实例上绕过属性和存储属性可能不是一个好主意。这是一个jsfiddle that shows it works in concept。我的猜测是,您的模型实例将通过代码中的其他位置通过fetch
从源数据重新创建,以便model.rsvp
属性消失。那个或model
与您认为的实例不同。
答案 2 :(得分:0)
model.rsvp = foo;
(让我们调用此代码位#1)等效model['rsvp'] = foo;
与model.set({'rsvp':foo});
(代码位#2)不同。如果要将另一个模型实例foo
(或其他一些对象或值)添加到模型实例model
上,请使用代码位#1或其等效项。如果要将属性值对添加到最终可能永久存储在某处的模型实例,请使用代码位#2。同样,如果您使用model.rsvp
或model.rsvp = foo;
model['rsvp'] = foo;