Backbone.js model.get()返回'undefined',即使我可以在console.log中看到属性

时间:2012-03-28 16:15:15

标签: javascript backbone.js

我有一个模型实例,我在其上设置了另一个模型实例,即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技能仍然很弱。我在这里缺少什么?

3 个答案:

答案 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.rsvpmodel.rsvp = foo;

,则只会定义model['rsvp'] = foo;