【问题标题】:Calling model.get() on a related model returning null values for attributes with backbone-relational在相关模型上调用 model.get() 返回具有主干关系的属性的空值
【发布时间】:2013-08-12 06:26:38
【问题描述】:

我目前正在为使用 web-sql 存储的 PhoneGap 项目使用主干、主干关系和 jQuery。

我正在尝试使用 Model.get('key') 从父对象中提取相关模型对象,但是当我这样做时,它会返回一个相关模型对象,其中仅设置了 id 属性 - 所有其他属性是不存在的。

在我的 GameModel 中,我定义了如下关系:

type: Backbone.HasOne,
key: "game_type_id",
relatedModel: GamePropertiesModel,
includeInJSON: true

... 3 more related models ...

在我看来,我正在循环我的 GameModel 的每个关系,并使用 Backbone.RelationalModel.fetchRelated() 延迟加载相关模型,如下所示:

_.each(self.model.getRelations(), function(relation) {
    dfds = dfds.concat(self.model.fetchRelated(relation.key));
})

当我打电话时:

console.log( self.model.get("game_type_id") )
OR
console.log( self.model.attributes['game_type_id'] )

我得到一个 GamePropertiesModel,但唯一的值集是 ID。未列出所有其他属性。

相反,如果我打电话:

console.log( self.model )

我可以通过 GameModel.attributes.game_type_id.attributes 深入了解并查看设置了值的属性的完整列表。

任何想法为什么会发生这种情况?我需要访问这些 GameModel 的相关模型才能在我的视图/模板中显示它们的属性值。

2013 年 8 月 12 日更新:

上述解决方案是我的 $.when 调用中的一个错误,并且在 SQL 查询实际运行之前,console.log 正在输出对象。这已通过以下方式更正:

$.when.apply(this, dfds).done(...)

现在我遇到了加载问题,因为骨干关系使用 Store 来确保仅存在一个 Model 对象的实例。基本上我渲染到视图 4 次以将项目附加到列表中,但视图中的最后一个项目在其他项目之前返回,相关对象为空。这是因为之前的列表项正在加载相同的相关对象,并在 Store 中标记了它已加载,但实际上查询尚未执行——它只是一个尚未加载的空实例。

我需要一些方法来按顺序循环遍历我的列表,这样就不会发生这种情况。有什么建议吗?

【问题讨论】:

    标签: jquery backbone.js web-sql backbone-relational


    【解决方案1】:

    在您的代码相关部分中,将includeInJson 更正为includeInJSON

    Backbone-Relational docs about includeInJSON

    使用dfds.push而不是dfds = dfds.concat,使用起来更快更好

    Comparision Tests - Array concat vs push

    【讨论】:

    • Ty,我已经更新了我的代码,但它仍然没有解决原来的问题。我发现 SQL 查询尚未运行,这就是我得到空相关对象的原因。奇怪的是,当我检索整个对象时它会出现。我已经用更多信息更新了我的问题。
    • 另外,我使用 array.concat 因为 .fetchRelated 返回一个 Deferred 对象数组,而不是单个实例。我不确定 $.when.apply 是否是递归的。如果是,那么我可以使用 array.push。
    猜你喜欢
    • 2016-07-21
    • 1970-01-01
    • 2017-07-16
    • 2019-04-25
    • 2016-04-17
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多