0

バックボーン プロジェクトのマスター ビュー/コントローラーを作成しようとしていますが、ビュー内のビューに正しくアクセスできません。コードは次のとおりです。

var Controller = Backbone.View.extend({
    initialize: function() {
        this.characterView = new CharacterView({model: character});
        this.encounterView = new EncounterView({collection: encounter});
        this.characterView.$el.on('click', '.attack', this.charAttack);
    },
    charAttack: function() {
        console.log(this.characterView);
    },
    render: function() {
        this.encounterView.render();
        this.characterView.render();
        console.log(this.characterView.model.toJSON());
    }
});

var controller = new Controller();
controller.render();

this.characterViewin charAttack は定義されていませんが、render 関数では正しいオブジェクトが使用されます。render が this.characterView にアクセスできる理由はわかりませんが、charAttack はアクセスできません。これを理解するための助けをいただければ幸いです。

4

3 に答える 3

1

初期化関数に_.bindAllを追加します。

initialize: function() {
    _.bindAll(this); // assuming Underscore < 1.5.0
    this.characterView = new CharacterView({model: character});
    this.encounterView = new EncounterView({collection: encounter});
    this.characterView.$el.on('click', '.attack', this.charAttack);
},

これによりthis、ビュー関数内 ( を含むcharAttack) が常にビューを参照することが保証されます。


この問題が発生しているかどうかを確認するには、コンソールを開いた状態で Chrome でこれを試してください。

charAttack: function() {
    debugger;
    console.log(this.characterView);
},

window次に、コンソールにこれを入力し、それがまたは別の変数にバインドされているかどうかを確認します。

于 2013-09-25T16:03:29.080 に答える
0

thisオブジェクトをインスタンス化しない限り、要素にアクセスすることはできません。

var ModController = function(){
    var characterView;
    var encounterView;

    var Controller = Backbone.View.extend({
        initialize: function() {
            characterView = new CharacterView({model: character});
            encounterView = new EncounterView({collection: encounter});
            this.characterView.$el.on('click', '.attack', this.charAttack);
        },
        charAttack: function() {
            console.log(characterView);
        },
        render: function() {
            encounterView.render();
            characterView.render();
            console.log(this.characterView.model.toJSON());
        } 
    });

    return new Controller();

}

var myController = new ModController(); 
myController.render();

したがって、パターンを明らかにすることで問題を解決できると信じています。

于 2013-09-25T16:03:55.463 に答える