BaseView
モジュール内のすべてのバックボーン ビューに対して何らかの初期化を実行する を追加しようとしています。
ここにフィドルがあり、コードは以下に再現されています
カスタム BaseView を作成し、それをディスパッチャーの「close」イベントにサブスクライブさせます。それが創造上のすべての子供たちの一部になるように。
var dispatcher = _.clone(Backbone.Events);
var ctor = Backbone.View;
var BaseView = Backbone.View.extend({
//override Backbone's constructor
constructor: function(options) {
ctor.apply(this, arguments);
dispatcher.on('close', this.close, this);
},
close: function() {
console.log(this.cid);
}
});
//Is this really needed??
BaseView.prototype.constructor = Backbone.View;
BaseView から継承する子ビューの作成:
var View = BaseView.extend({
el: '#clickholder',
initialize: function() {
_.bindAll(this);
},
//Events not bound?
events: {
"click #clicker": "clicked"
},
//never called :(
clicked: function(e) {
alert("clicked button");
}
});
new View();
HTMLは次のとおりです。
<div id="clickholder">
<button id="clicker">Clicker</button>
</div>
質問:ボタンをクリックしても、イベントは発生せず、アラートも表示されません。何が問題なのかわからない。私はそれにかなりの時間を費やしてきましたが、なぜevents
にバインドされていないのか理解できませんView
? 私は何を間違っていますか?
PS: これは、こちらの回答に基づいています。私は特に BaseView クラスを作成して、これがアプリケーション全体のすべてのバックボーン ビューにグローバルに影響を与えないようにしましたが、特定のモジュールに制限したままにしました
更新:以下の@muの回答に従ってフィドルを修正しました。ボタンを div でラップしても問題は解決しないようです。簡単にするために、誤ってビューをボタンに直接バインドしてしまいました。私のメインアプリケーションでは、ボタンはビューの el の「内」にあるため、上記の BaseView が配置される「前」に委任が正常に機能しました。