2013-07-02 55 views
1

我想构建一个酒店和房间的应用程序。
每个酒店能有更多的房间,我检索XML中的外部服务器这个数据,我分析它,现在我已经分成两个数组:酒店和房间是这样的:
hotel.json骨干如何正确构建json

[ 
    { 
    "id": "1", 
    "name": "Hotel1" 
    }, 
    { 
    "id": "2", 
    "name": "Hotel2" 
    }, 
    { 
    "id": "3", 
    "name": "Hotel3" 
    } 
] 

房.json

[ 
    { 
    "id" : "r1", 
    "hotel_id" : "1", 
    "name" : "Singola", 
    "level" : "1" 
    }, 
    { 
    "id" : "r1_1", 
    "hotel_id" : "1", 
    "name" : "Doppia", 
    "level" : "2" 
    }, 
    { 
    "id" : "r1_3", 
    "hotel_id" : "1", 
    "name" : "Doppia Uso singol", 
    "level" : "1" 
    }, 
    { 
    "id" : "r2", 
    "hotel_id" : "2", 
    "name" : "Singola", 
    "level" : "1" 
    }, 
    { 
    "id" : "r2_1", 
    "hotel_id" : "2", 
    "name" : "Tripla", 
    "level" : "1" 
    } 
] 

进入我的骨干应用程序,我必须做一些控制器和一些解析来检索其酒店的房间。
我想知道,如果是更好地为骨干,构建一个JSON这样的:

[ 
     { 
     "id": "1", 
     "name": "Hotel1", 
     "rooms": [ 
       { 
        "id" : "r1", 
        "hotel_id" : "1", 
        "name" : "Singola", 
        "level" : "1" 
       }, 
       { 
        "id" : "r1_1", 
        "hotel_id" : "1", 
        "name" : "Doppia", 
        "level" : "2" 
       } 
       ] 

     }, 
     { 
     "id": "2", 
     "name": "Hotel2", 
     "rooms": [ 
       { 
        "id" : "r2", 
        "hotel_id" : "2", 
        "name" : "Singola", 
        "level" : "1" 
       }, 
       { 
        "id" : "r2_1", 
        "hotel_id" : "1", 
        "name" : "Doppia", 
        "level" : "2" 
       } 
       ] 
     }, 
     { 
     "id": "3", 
     "name": "Hotel3" 
     } 
    ] 

这是对骨干网的效率和解析方面更好的模式? 我想到了第一个案例,但构建应用程序后,我不知道。

+0

也对此感兴趣,因为刚刚接触骨干,我最终得到了分离集合,只因为我可以早期从视图中侦听事件,而不依赖于其他模型的构造。 – DRC

回答

1

我会建议保持数据结构平坦,因为Backbone并不真正支持嵌套集合而无需额外的工作。使数据模型保持平坦还将使您更容易映射到REST端点(即“/ hotels/1/rooms”,“rooms/1”等)。

只是为了演示的复杂性,这里是怎么一会要收集到的模型相关联的例子:

HotelModel = Backbone.Model.extend({ 
    initialize: function() { 
     // because initialize is called after parse 
     _.defaults(this, { 
      rooms: new RoomCollection 
     }); 
    }, 
    parse: function(response) { 
     if (_.has(response, "rooms")) { 
      this.rooms = new RoomCollection(response.rooms, { 
       parse: true 
      }); 
      delete response.rooms; 
     } 
     return response; 
    }, 
    toJSON: function() { 
     var json = _.clone(this.attributes); 
     json.rooms = this.rooms.toJSON(); 
     return json; 
    } 
}); 

配有一台数据结构,你可以做这样的事情:

HotelModel = Backbone.Model.extend({ 
    idAttribute:'hotel_id', 
    urlRoot:'/hotels' 
}); 
RoomModel = Backbone.Model.extend({ 
    idAttribute:'room_id', 
    urlRoot:'/rooms' 
}); 

HotelCollection = Backbone.Collection.extend({ 
    url: '/hotels', 
    model:HotelModel 
}); 
RoomCollection = Backbone.Collection.extend({ 
    url: '/rooms', 
    model:RoomModel, 
    getByHotelId: function(hotelId){ 
     return this.findWhere({hotel_id:hotelId}); 
    } 
}); 
+0

如果您看到问题这个问题,我不能走出去是我的问题的第二部分。 http://stackoverflow.com/questions/17417589/recursive-function-jquery-with-backbone –

+0

但是你的问题很好开始解析数据,我跟着你去分开我的json tohave平面数组。 +1为伟大的答案 –

+0

很高兴我能帮上忙。我不确定我是否理解,但“不能出去”。 –