2013-07-03 10 views
11

मेरे पास रीढ़ की हड्डी में एक ऐप है जो सर्वर से डेटा पुनर्प्राप्त करता है। यह डेटा होटल और foreach होटल हैं मेरे पास और अधिक कमरे हैं। मैं इस तरह एक और json अंदर एक json और कमरे में होटल बांट दिया है:बैकबोन नेस्टेड संग्रह

hotel.json

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

rooms.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" 
    } 
] 

मैं हर होटल ले करना चाहते हैं और (अपने कमरे के साथ गठबंधन बाहरी कुंजी rooms.jsonhotel_id) और कमरे के संयोजन को मुद्रित करें: foreach स्तर विभिन्न कमरे गठबंधन। स्तर 1 का

एक कमरे में, स्तर 2 में से एक कमरा और स्तर के एक कमरे 3.

स्तर की अधिकतम 3 है, लेकिन मैं केवल एक ही स्तर या केवल दो स्तर हो सकता है। अगर मैं 3 स्तर है मैं नहीं चाहता कि स्तर 1 और स्तर 2 के संयोजन के स्तर के बिना चाहते 3.

कुछ इस

Room "Single", "level" : "1" , "hotel_id" : "1" 
Room "Double", "level" : "2" , , "hotel_id" : "1" 
Room "Triple", "level" : "3" , , "hotel_id" : "1" 

Room "Double for single", "level" : "1" , "hotel_id" : "1" 
Room "Double", "level" : "2" , , "hotel_id" : "1" 
Room "Triple", "level" : "3" , , "hotel_id" : "1" 

इस कमरे मुझे लगता है कि है की निर्माता की तरह मेरे ऐप में रेंडर करने के लिए रेंडर करने के लिए।

यह मेरी अनुप्रयोग है:

var Room = Backbone.Model.extend(); 
var Rooms = Backbone.Collection.extend({ 
    model: Room, 
    url: "includes/rooms.json" 
}); 
var Hotel = Backbone.Model.extend({ 
    defaults: function() { 
     return { 
      "id": "1", 
      "name": "Hotel1", 
      "rooms": [] 
     } 
    } 
}); 
var HotelCollection = Backbone.Collection.extend({ 
    model: Hotel, 
    url: "includes/test-data.json", 
    initialize: function() { 
     console.log("Collection Hotel initialize"); 
    } 
}); 
var HotelView = Backbone.View.extend({ 
    template: _.template($("#hotel-list-template").html()), 
    initialize: function() { 
     this.collection = new HotelCollection(); 
     this.collection.bind('sync', this.render, this); 
     this.collection.fetch(); 
    }, 
    render: function() { 
     console.log('Data hotel is fetched'); 
     this.bindRoomToHotel(); 
     var element = this.$el; 
     element.html(''); 
    }, 
    bindRoomToHotel: function() { 
     allRooms = new Rooms(); 
     allRooms.on("sync", this.renderRooms, this) 
     allRooms.fetch(); 
    }, 
    renderRooms: function() { 


     $(this.el).html(this.template({ hotels: this.collection.models })); 
    } 
}); 

var hotelView = new HotelView({ 
    el: $("#hotel") 
}); 

कैसे मैं इस कमरे संयोजन बना सकते हैं और इसे प्रिंट कर सकते हैं?
क्या कोई अच्छा तरीका है या कुछ बेहतर है?

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; 
    } 
}); 

RoomModel = Backbone.Model.extend({ 
}); 

HotelCollection = Backbone.Collection.extend({ 
    model: HotelModel 
}); 

RoomCollection = Backbone.Collection.extend({ 
    model: RoomModel 
}); 

तो फिर तुम कुछ इस तरह कर सकते हैं::

+0

मैं इस मुद्दे के बारे में अपने अन्य प्रश्न निम्नलिखित किया गया है और यह आप की तरह दिखाई देता आपको कई समस्याएं मिली हैं जिन्हें आप काम करने की कोशिश कर रहे हैं। आपको वास्तव में क्या चाहिए वह कार्टेशियन फ़ंक्शन है जिसे @Bergi ने इस प्रश्न में सुझाव दिया है http://stackoverflow.com/questions/17417589/recursive-function-jquery-with-backbone। मैं उस रास्ते को जारी रखूंगा। –

+0

मैंने पहले से ही कोशिश की है लेकिन ऐसा लगता है कि काम नहीं करता है, पहले समूह की सरणी खाली है मुझे नहीं पता क्यों .. @moderndegree –

+0

मैंने इस प्रश्न के लिए @ बर्गी के उत्तर में एक अपडेट सबमिट किया है (http://stackoverflow.com/ प्रश्न/17417589/पुनरावर्ती कार्य-jQuery-साथ-रीढ़ की हड्डी)। इस बीच, आप यहां एक कार्य उदाहरण देख सकते हैं: http://plnkr.co/edit/NHE9V5?p=preview। –

उत्तर

20

का तरीका यहां बताया संग्रह संरचना कर सकते हैं

var hotels = new HotelCollection(); 
hotels.reset([{ 
    id: 1, 
    name: 'Hotel California', 
    rooms: [{ 
     id: 1, 
     name: 'Super Deluxe' 
    }] 
}], { 
    parse: true // tell the collection to parse the data 
}); 

// retrieve a room from a hotel 
hotels.get(1).rooms.get(1); 

// add a room to the hotel 
hotels.get(1).rooms.add({id:2, name:'Another Room'}); 
+0

नमस्ते मुझे पता है कि यह एक पुराना उत्तर है, लेकिन इसे 'this.attributes' में नहीं जोड़ा जाना चाहिए, क्योंकि आप 'model' नहीं कर सकते हैं क्योंकि आप 'model.get (' rooms ')' – Quince

+1

नहीं कर सकते हैं क्योंकि यह 'कमरे' है एक संग्रह है और 'get() 'या' set() 'के माध्यम से सीधे संबोधित करने की आवश्यकता है। उदाहरण के लिए, यदि आप 'सेट (' रूम ', [])' कॉल करना चाहते थे, तो संग्रह सिंक से बाहर होगा। मुझे लगता है कि आप इसे 'परिवर्तन: कमरे' सुनने के लिए पुन: कार्य कर सकते हैं और इसे इस तरह से संभाल सकते हैं लेकिन यह बहुत काम की तरह लग रहा था। –

+0

यदि 'रूम' आपके मॉडल विशेषताओं हैश के अंदर एक संग्रह है, तो आप सिंक संग्रह से बचने के लिए रीसेट ([])' रीसेट ([]) 'का उपयोग कर सकते हैं और इसे सुनने से बच सकते हैं। –

संबंधित मुद्दे