0

Backbone.js で単一ページ Web アプリの基盤を構築しようとしています。JSON を「画面」に構造化し、各画面に ID を割り当てました。

最初のページ読み込み時と on.click イベント後の両方で、特定の画面からデータをレンダリングできるようにしたいと考えています。

新しいモデル インスタンスを作成するときに ID を渡そうとしましたが、これまでのところ、不規則な結果が得られています。指定したものとは異なる JSON のセクションをレンダリングしているか、単にすべてをレンダリングしています。特定の「画面」を(そのIDを介して)選択する方法についての指針は大歓迎です。

以下は、参考となる JSON サンプル コードです。

[{
          "id": 0,
              "options": [ 
                { "text": "Tackle player", "next": [ 0, 1 ] }, 
                { "text": "Dribble the ball", "next": [ 1 ] }
              ],
              "results": [
                { "text": "Tackle successful", "next": [ 0 ] },
                { "text": "You are close enough to shoot", "next": [ 0, 1 ] }
              ]
            },



        {  
          "id": 1,
              "options": [ 
                { "text": "BLAH", "next": [ 0, 1 ] }, 
                { "text": "BLAH2", "next": [ 1 ] }
              ],
              "results": [
                { "text": "BLAH3", "next": [ 0 ] },
                { "text": "BLAH4", "next": [ 0, 1 ] }
              ]
        }

    ]

そして、ここに私のバックボーンコードがあります:

var app = app || {};

app.Screen = Backbone.Model.extend({
url: '/api',

parse: function(response){
    return response;
}
});

var Screens = Backbone.Collection.extend({
model: app.Screen,
url: '/api'
});


app.AppView = Backbone.View.extend({

initialize: function(parameters){

    this.listenTo(this.collection, 'add', this.addOne);

},


render: function(){
    this.$el.html("test");
    this.addAll();
    return this;
},


addAll: function(){
    this.collection.each(this.addOne, this);
},  


addOne: function(model){
    var screen_view = new app.ScreenView({
        model: model});
    screen_view.render();
    this.$el.append(screen_view.el);

}

});



app.ScreenView = Backbone.View.extend({

template: _.template(

    '<ul id="options">' +
        '<% _.each(options, function(info) { %>' +
        '<li id="optionA"><a href="#"><%= info.text %></a></li>' +
        '<% }); %>' +
    '</ul>'
    ),

initialize: function(options) {
    this.listenTo(this.model, 'change', this.render);
    this.listenTo(this.model, 'destroy', this.remove);
},
render: function() {
    this.$el.html(this.template(this.model.toJSON()));
    return this;
}

});


$(function() {


var screen = new app.Screen({id:0}); //CURRENTLY BEHAVING VERY STRANGELY - change ID to 1 and you will get id 0 expected responses
app.screenCollection = new Screens([screen]);

app.screenCollection.fetch();

new app.AppView({
    collection: app.screenCollection, el: $('.gameWrapper')
}).render(); 


});
4

1 に答える 1

1

screens画面の配列である解析された JSON データの配列インデックスを参照しないのはなぜですか。

var screen = new app.Screen(screens[index]);

別の方法は、 JSONPathのようなものを使用して、id に基づいてオブジェクトにアクセスすることですが、これはもう少し複雑です。

于 2013-10-08T17:00:42.517 に答える