【问题标题】:Backbone nested collection主干嵌套集合
【发布时间】:2016-11-28 03:28:07
【问题描述】:

我在骨干网中有一个从服务器检索数据的应用程序。这个数据是hotels and foreach hotel 我有更多房间。我已将酒店分为一个 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 level 结合不同的房间。

一楼一间,二楼一间,三楼一间。

最高级别为 3,但我可以只有一个级别或只有两个级别。 如果我有 3 级,我不想在没有 3 级的情况下将 1 级和 2 级结合起来。

像这样的

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"

我认为这个房间的构造函数是将renderRooms放入我的应用程序中。

这是我的应用程序:

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

如何创建这个房间组合并打印出来?
有什么好的方法还是有更好的方法?

【问题讨论】:

标签: javascript backbone.js backbone.js-collections


【解决方案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;
    }
});

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

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

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

然后你可以这样做:

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

【讨论】:

  • 嗨,我知道这是一个旧答案,但不应该将房间添加到 this.attributes 而不仅仅是 this,因为你不能这样做 model.get('rooms')
  • 这是因为rooms 是一个集合,需要直接寻址,而不是通过get()set()。例如,如果您要调用set('rooms', []),则集合将不同步。我想你可以重做它来听change:rooms 并以这种方式处理它,但它似乎需要做很多工作。
  • 如果rooms 是模型属性哈希中的集合,您可以只使用get('rooms').reset([]) 来避免不同步集合并避免收听它。
猜你喜欢
  • 1970-01-01
  • 2014-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2017-03-24
相关资源
最近更新 更多