1

バックボーンでのイベント伝播に関する奇妙な問題。ほとんどの人がイベントの伝播を停止する方法を尋ねますが、私は自分のイベントを伝播させるのに苦労しています!!

ここに 2 つの View オブジェクトがあります。Item ビューを含み、クリック イベントをリッスンして run() を呼び出す MainView:

var MainView = Backbone.View.extend({
    ...

    events: {
        "click .item": "run" // works only if no click event in Item
    },

    render: {
         // Item View object children
    },

    run: function() {
        //run :)
    }
});

アイテム ビュー オブジェクトは、自身のクリック イベントをリッスンして動作のオン/オフを切り替えます。

var Item = Backbone.View.extend({
    ...

    events: {
        "click" : "toggle" // MainView click event works when this is removed
    },

    toggle: function() {
        this.model.toggle();
    }
});

Item.toggle() のクリック イベントがあるのに、Item がクリックされたときに MainView.run() が起動されないという問題があります。

ただし、Item.toggle () クリックイベントを削除すると、 MainView.run() が発生します。私の制御の及ばない範囲で、何らかの形でイベントの伝播が強制的に停止されたという結論に至りました。

どうすればこの問題を解決できますか? 明らかな何かが欠けていますか、それとも避けられないのでしょうか?

すべての提案と回答に感謝します:)。

4

2 に答える 2

0

Jay B. Martin が質問に答えました。

問題は、ビューが this.model.toggle(); を呼び出すことです。

toggle() 関数は、MainView がリッスンしているいくつかの変数を設定し、render() イベントを発生させます。

MainView が render() を呼び出すと、Item ビューが削除され、レンダリングされ、DOM に追加されます。これにより、イベント {} を使用して DOM 要素にバインドされたイベントが失われます。

代わりに _.bind() または _.bindAll() を使用して、DOM にバインドされた要素のコンテキスト/状態に関係なく、イベントを永続的にバインドする必要がありました。


元のコメントの回答:

@ Dan0、申し訳ありませんが、トグルが問題の原因である可能性について少し混乱しています。これは、ネストされたビューで暗黙の DOM 要素にバインドすることによって作成されるコンテキストのあいまいさの症状だと思います。トグルが呼び出されると、クリック イベントは最初にバインドされたコンテキスト (つまり、this.el) を失います。これを解決する慣用的な方法は、a) 後続のイベントで再バインドできるように明示的な要素を渡すか、b) _.bind または _.bindAll を使用して、クリック イベントがコンテキストとして itemview に永続的にバインドされるようにすることです。変化します。– ジェイ B. マーティン 8 月 10 日 23:46

于 2013-08-17T14:54:32.447 に答える
0

アイテム ビューのクリック イベントが特定の DOM オブジェクトにバインドされていないようです。一般的なクリック イベントをリッスンすることで、バックボーンが特定の .item クリック イベントをリッスンすることをオーバーライドしている可能性があります。ID またはクラス名をアイテム ビューのクリック イベントに追加して、あいまいさをなくしてみてください。

var Item = Backbone.View.extend({

  ...

  events: {
    "click .some-class" : "toggle" // This should fix your problem
  },

  ...   
于 2013-08-09T15:55:36.997 に答える