0

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 が配置される「前」に委任が正常に機能しました。

4

1 に答える 1

2

いくつかの問題があります。

  1. バックボーン コードはドキュメント内で実行されている<head>ため、実行されるタイミングがない#clickerため、イベントをバインドするものはありません。
  2. あなたのビューelはあるはずですが、あなたのイベントはinside#clickerにバインドしようとしています。細かいマニュアルから:#clicker el

    デリゲートイベント delegateEvents([events])

    [...]selector原因を省略すると、イベントはビューのルート要素 ( ) にバインドされますthis.el

    のクリックにバインドする場合は、次のようにしelます。

    events: {
        "click": "clicked"
    }
    

更新されたデモ: http://jsfiddle.net/ambiguous/fTrSj/

于 2012-08-25T22:26:44.840 に答える