骨干关系延迟加载

时间:2011-09-11 19:33:55

标签: javascript backbone.js backbone-relational

我正在使用Backbone和我的RESTful JSON API来创建一个适用于帖子及其评论的应用程序。我一直试图让Backbone Relational工作,但是在我的Lazy加载时会遇到问题。

我加载了一个帖子列表,没有相关的评论。点击列表中的帖子,我打开一个视图,提取完整的帖子,包含评论,并呈现此内容。

我有2个Backbone.RelationModels,帖子和评论。评论的帖子关系设置如下:`

relations: [{
            type: Backbone.HasMany,
            key: 'comments',
            relatedModel: 'Comment',
            includeInJSON: true, // don't include it in the exporting json
            collectionType: 'Comments'
        }]

现在我面临的问题是,一旦我检索到我的列表,关系就会被初始化,但不包含评论。我稍后通过它的URI获取模型来加载完整数据。但是,关系似乎没有重新初始化,调用Posts.get(1).get('comments')返回一个空的Comments集合!

有谁知道我怎样才能最好地解决这个问题?数据就在那里,似乎评论的集合没有得到更新。

编辑:我可以让Post模型绑定它的更改:对自身的注释,它会更新集合。但是,我似乎找不到一个可靠的方法来获取原始注释'JSON,因为this.get('comments')返回Comments集合。

注意:在我的集合中,我会解析JSON以使其与我的API一起使用,并使用以下代码:

parse: function(response) {
        var response_array = [];
        _.each(response, function(item) {
            response_array.push(item);
        });

        return response_array;
    }

这是因为我的API返回的JSON返回一个带有索引键(关联数组)而不是原生JSON数组的对象。

{
    "id" : "1",
    "title" : "post title",
    "comments" : {
        "2" : {
            "id" : "2",
            "description": "this should solve it"
        },
        "6" : {
            "id" : "6",
            "description": "this should solve it"
        }
    }
}

非常感谢!请问任何问题,我确定我在某个地方一直模糊不清!

2 个答案:

答案 0 :(得分:3)

Backbone Relational模型不解析除数组之外的集合,我的问题中的JSON不起作用。我更改了后端以返回正确数组中的注释

{
    "id" : "1",
    "title" : "post title",
    "comments" : [
        {
            "id" : "2",
            "description": "this should solve it"
        },
        {
            "id" : "6",
            "description": "this should solve it"
        }]
    }
}

RelationalModel不尊重Backbone在移动之前提供的解析JSON的解析函数。随着后端返回“正确”的JSON,延迟加载无需任何额外代码即可运行。

答案 1 :(得分:1)

您还可以在评论模型上使用initialize方法,模拟解析方法并使用这样的自定义值定义属性(CoffeeScript):

initialize: (obj) ->
  @attributes = obj.customKey