1

バックボーンに、次のような外部 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"
  }
]

それを解析してフェッチし、groupBy の後で hotel_id を作成し、レベルでグループ化された配列を作成します。
これを試してみましたが、空の配列があります。

var Room = Backbone.Model.extend();
        var Rooms = Backbone.Collection.extend({
            model:Room,
            url : "includes/rooms.json"
        });
 var RoomView = Backbone.View.extend({ 
            initialize: function(){ 
                allRooms = new Rooms();
                allRooms.on("sync", this.render, this)
                allRooms.fetch();
            },
            render: function(){
                var rooms = _.groupBy(allRooms.models,'hotel_id');
                for (var hotelid in rooms)
                    rooms[hotelid] = _.groupBy(rooms[hotelid], "level");
            }

       });

トレースすると、部屋の空の配列が返されます

4

1 に答える 1

3

あなたはそれを正しくやっているようです。

  1. ネットワークタブを調べてください - 呼び出しが行われており、json が正常に返されていますか?
  2. コレクションを注文する前に、コレクションにデータが入力されていますか ( console.log it)

// Define the model
var Room = Backbone.Model.extend();

// Define the collection
var Rooms = Backbone.Collection.extend(
{
    model: Room,
    url: 'includes/rooms.json',
});

// Define the View
var RoomsView = Backbone.View.extend({
    roomCollection: null,

    initialize: function() {
        this.roomCollection = new Rooms;
        var that = this;
        this.roomCollection.fetch({
            success: function () {
                that.render();
            }
        });
    },

    render: function() {
        console.log(this.roomCollection.toJSON());

        // Note: Haven't tested your logic
        var rooms = _.groupBy(this.roomCollection.models,'hotel_id');
        for (var hotelid in rooms)
            rooms[hotelid] = _.groupBy(rooms[hotelid], 'level');

        console.log(rooms);
    }
});

私が気づいたことの 1 つは、あなたが聞いていたsyncsyncは、ajax 呼び出しを行うメソッドです。ajax 呼び出しをオーバーライドして独自のものを作成したい場合に便利ですが、代わりに fetchのsuccessandをリッスンする必要があります。http://backbonejs.org/#Collection-fetcherror

于 2013-07-02T20:12:36.957 に答える