2013-07-03 37 views
11

Tôi có một ứng dụng trong xương sống lấy dữ liệu từ một máy chủ. Dữ liệu này là khách sạn và khách sạn foreach tôi có nhiều phòng hơn. Tôi đã chia khách sạn thành một json và các phòng bên trong json khác như thế này:Backbone lồng nhau bộ sưu tập

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

Tôi muốn lấy mỗi khách sạn và kết hợp với các phòng của nó (khóa ngoài vào rooms.jsonhotel_id) và in kết hợp các phòng: cấp độ kết hợp với các phòng khác nhau.

Một phòng cấp 1, một phòng của tầng 2 và một phòng cấp 3.

tối đa mức là 3 nhưng tôi có thể chỉ có một mức độ hoặc chỉ có hai cấp độ. Nếu tôi có 3 mức tôi không muốn sự kết hợp của cấp 1 và cấp 2 mà không cấp 3.

Something như thế này

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" 

Các nhà xây dựng phòng này tôi nghĩ là để đưa vào renderRooms vào ứng dụng của tôi.

Đây là ứng dụng của tôi:

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

Làm thế nào tôi có thể tạo ra sự kết hợp phòng này và in nó?
Có cách nào hay cách nào tốt hơn?

+0

Tôi đã theo dõi câu hỏi khác của bạn về vấn đề này và có vẻ như bạn đã có một số vấn đề mà bạn đang cố gắng để làm việc ra ngoài. Những gì bạn thực sự cần là hàm cartesian mà @Bergi đề xuất trong câu hỏi này http://stackoverflow.com/questions/17417589/recursive-function-jquery-with-backbone. Tôi sẽ tiếp tục xuống con đường đó. –

+0

Tôi đã thử nhưng có vẻ như không hoạt động, mảng nhóm đầu tiên trống rỗng Tôi không biết tại sao .. @moderndegree –

+0

Tôi đã gửi bản cập nhật cho câu trả lời của @ Bergi cho câu hỏi này (http://stackoverflow.com/ câu hỏi/17417589/đệ quy-chức năng-jquery-với-xương sống). Trong thời gian chờ đợi, bạn có thể xem ví dụ hoạt động tại đây: http://plnkr.co/edit/NHE9V5?p=preview. –

Trả lời

20

Đây là cách bạn có thể cấu trúc các bộ sưu tập:

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

Sau đó, bạn có thể làm một cái gì đó như thế này:

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

Xin chào Tôi biết đây là câu trả lời cũ nhưng không nên thêm phòng vào 'this.attributes' không chỉ 'this' vì bạn không thể làm' model.get (' rooms ') ' – Quince

+1

Điều này là do' phòng' là một Bộ sưu tập và cần được giải quyết trực tiếp, thay vì thông qua 'get()' hoặc 'set()'. Ví dụ: nếu bạn gọi 'set (' rooms ', []) ', Collection sẽ không đồng bộ. Tôi cho rằng bạn có thể làm lại nó để nghe 'thay đổi: phòng' và xử lý theo cách đó nhưng nó có vẻ như rất nhiều công việc. –

+0

Nếu 'phòng' là một bộ sưu tập bên trong thuộc tính mô hình của bạn băm, bạn chỉ có thể sử dụng' get ('rooms'). Reset ([]) 'để tránh bộ sưu tập đồng bộ và cũng tránh nghe nó. –

Các vấn đề liên quan