5

バックボーンでは、新しいBackbone.listenToイベントを使用しています。私のインスタンスの1つには、リスナーが3つの異なるイベントに接続されています。

this.listenTo(this._Collection, 'reset add change', this._setCollection);

想定されるときに適切に呼び出され、問題はありません。私が知らないのは、どのイベントがトリガーされたかを見つける方法です。e私は以下を使用して引数にアクセスできます:

_setCollection: function(e) {
    // Do fun stuff
}

問題は、e引数がコレクションのコピーを送信するだけで、実際にトリガーされるイベントについては言及していないことです。試しましe.typee.targetが、それらのオブジェクトは存在しません。eChrome開発ツールからのオブジェクトのコピーは次のとおりです。

_byCid: Object
_byId: Object
_events: Object
    add: Array[1]
    change: Array[1]
    remove: Array[1]
    reset: Array[1]
__proto__: Object
_listenerId: "l16"
length: 3
models: Array[3]

トリガーされたイベントを確認するにはどうすればよいですか?

編集:回答の明確化:マークされた回答は技術的には正しいですが、mu_is_too_shortが指摘しているように、正しい回答は複数のハンドラーを使用しており、このタイプの「chicanery」を実行していません

4

1 に答える 1

9

イベントの種類を直接検出することはできませんが、場合によっては から推測できますargumentsイベントカタログには次のように書かれています。

  • 「追加」 (モデル、コレクション、オプション) — モデルがコレクションに追加されたとき。
  • 「リセット」 (コレクション、オプション) — コレクションの内容全体が置き換えられたとき。
  • 「変更」 (モデル、オプション) — モデルの属性が変更されたとき。

幸運なことに、これら 3 つのイベントはすべて異なるパラメーターを持っているため、の内容によってarguments(この場合) トリガー イベントが一意に決定されます。

  1. arguments[0]がモデルでarguments[1]コレクションの場合、イベントがあります"add"
  2. arguments[0]がコレクションの場合、"reset"イベントがあります。
  3. arguments[0]がモデルでarguments.length2 の場合、イベントがあります"change"

したがって、次のような不快で壊れやすいことを で実行できます_setCollection

    // M is your model, C is your collection.
    if(arguments[0] instanceof M
    && arguments[1] instanceof C) {
        // An "add" event...
    }
    else if(arguments[0] instanceof C) {
        // A "reset" event...
    }
    else if(arguments[0] instanceof M
         && arguments.length == 2) {
        // A "change" event...
    }
    else {
        console.log('confusion!');
    }

デモ: http://jsfiddle.net/ambiguous/Y9UUX/

ただし、この種のごまかしはお勧めしません。扱いにくく、壊れやすく、リストにイベントの種類を追加すると破損する可能性があります。イベント ハンドラーがそれをトリガーしたイベントの種類を知る必要がある場合は、イベントの種類ごとに個別のハンドラーを使用する方がよいでしょうlistenTo

于 2013-01-10T00:42:46.793 に答える