Backbone.js model.get() 返回“未定义”,即使我可以在 console.log 中看到属性

IT技术 javascript backbone.js
2021-02-19 12:55:25

我有一个模型实例,我在它上面设置了另一个模型实例,即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 返回未定义。

我必须承认我的 Javascript 技能仍然很弱。我在这里错过了什么?

3个回答

console.log( Object )可以骗你。它不会向您显示Object调用时的状态console.log

检查这个jsFiddle并打开控制台。您会看到如何在脚本结束时而不是在通话时console.log向您显示 的状态Objectconsole.log

要获得更可靠的信息,请console.log使用更简单的值调用

(在 OSX 上测试的是 Chrome、Firefox 和 Safari)

阅读更多详细信息:Backbone.js Empty Array Attribute

你说得对。$.when 调用存在错误,但我不知道这是问题的根源,因为 console.log 看起来不错。显然不太对劲。谢谢!
2021-04-21 12:55:25

从理论上讲,您所做的应该可以工作,但是绕过属性并直接在模型实例上存储属性可能不是一个好主意。这是一个jsfiddle,显示它在概念上有效我的猜测是您的模型实例是通过fetch代码中的其他地方从源数据重新创建的,因此该model.rsvp属性消失了。那或者model不是你认为的同一个实例。

我最初尝试先使用 .set,结果相同。并且console.logs 是背靠背的。所以它显示实例,然后在我尝试获取属性时显示未定义。所以我不知道在那个时期它会如何被重置。
2021-05-05 12:55:25

model.rsvp = foo;(让我们称之为代码位 #1),这model['rsvp'] = foo;model.set({'rsvp':foo}); (代码位 #2)等价不同如果您想将另一个模型实例foo(或某个其他对象或值)附加到模型实例上model,请使用代码位 #1 或其等效项。如果要将属性值对添加到最终可能永久存储在某处的模型实例中,请使用代码位 #2。同样,model.rsvp如果您使用model.rsvp = foo;model['rsvp'] = foo;