2013-04-26 116 views
0

我已经到了我的应用程序中的一个地方,我无法决定应该使用哪种类型的JSON结构。我的应用程序有像下面多重嵌套视图 -使用backbone和json

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

目前我使用的是包含在一个所有的浏览量,而在另一个所有sectionViews ......等单JSON文件。这是因为我严重依赖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抓取已经做到了这一点。我想我问的是......有没有人遇到过这个问题,以及解决方案是什么?任何想法或演示都是一如既往的欢迎。提前致谢。

回答

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,并且仍然适合你想要的任何客户端骨干代码结构。

+0

这听起来很像我的问题。不过,我只是有一个想法。骨干保存让我可以保存我的藏品,不用大惊小怪。如果我沿着你提到的路线走下去,我将如何将我的藏品保存回一个大的JSON文件中? – darylhedley 2013-04-26 21:22:18

+1

您可以重写collection.sync以执行任何您想要的操作。更好的方法是使用内置骨干行为并在添加项目时调用collection.create(model),并将model.save绑定到适用于您的应用程序的任何事件。 – 2013-04-27 02:24:50