使用backbone和json

时间:2013-04-26 20:31:33

标签: json backbone.js backbone-views

我已经在我的应用程序中找到了一个点,我无法确定应该使用哪种类型的JSON结构。我的应用程序有多个嵌套视图,如下所示 -

-pageView
    -sectionView
        -articleView
            -widgetView
    -sectionView
        -articleView
            -widgetView
            -widgetView
        -articleView
            -widgetView

目前我正在使用单个JSON文件,其中包含一个中的所有pageViews以及另一个中的所有sectionViews ...依此类推。这是因为我非常依赖Backbone Collections来对模型进行排序并渲染每个视图。但很明显,对于这种类型的结构,我只是为页面视图做了四次提取。 (这甚至都不是我的应用程序)。我在应用程序开始时获取所有这些内容,因为搜索工具需要它们并显示完成状态。每个模型都知道它的父级,这就是它能够插入父容器的方式。

另一方面,我可以使用一个包含所有内容的大型嵌套JSON文件,看起来像这样:

{
    "page":"page_05",
    "title":"Title of page",
    ...
    "sections":[
        {
            "section":"section_05",
            "title":"section title",
            "articles":[
                {
                    "article":"article_05",
                    "title":"article title",
                    "widgets":[
                        {
                            "widget":"widget_05",
                            ...
                        }

                    ]
                }
            ]
        },
        {
            "section":"section_10"             
            ...
        }

    ]

我不介意我构建它的方式,因为我可以简单地将数据放入集合中。如果我使用单个JSON文件,当Backbone fetch已经执行此操作时,必须编写将执行此操作的函数似乎有点奇怪。我想我要问的是......有没有人遇到过这个问题,有什么解决方案?任何想法或演示都一如既往地欢迎。提前谢谢。

1 个答案:

答案 0 :(得分:2)

如果我可以尝试概括,你的问题是理想的数据格式(一个巨大的响应)似乎不适合Backbone在模型和集合上使用fetch的方案。这不是Backbone的常见问题,因此Backbone内置了一个解决方案:parse

Backbone.CollectionBackbone.Model都有parse方法,默认情况下不执行任何操作。但是,您可以覆盖它以添加从fetch调用返回的任何内容的自定义响应处理,例如:

parse: function(originalGiantResponse) {
    someModel.set(originalGiantResponse.someModelPart);
    someCollection.add(originalGiantResponse.someCollectionPart);
    return originalGiantResponse.mainPart; // use the "mainPart" of the response
}

通过使用一个或多个parse覆盖,您应该能够使用您想要的服务器端JSON的任何结构,并且仍然使其适合您想要的任何客户端Backbone代码结构。