5

バックボーンでは、私は新しいBackbone.listenToイベントを使用しています。私のインスタンスの一つは、3つの異なるイベント例えば:それはになって、そこに問題がないだとき、それが適切と呼ばれるBackbone.listenToからトリガーイベントを見つける方法

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

に添付リスナーを持っています。私が知らないのは、どのイベントが引き起こされたかを知る方法です。

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

問題はe引数は専用のコレクションのコピーを送信し、実際にトリガーされたものをイベント言及していないということです。私は使用してe引数へのアクセス権を持っています。私はe.typee.targetを試しましたが、これらのオブジェクトは存在しません。ここではクロームのDevツールからeオブジェクトのコピーです:

_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] 

私がトリガされたものをイベントを見つけることができますどのように?

EDIT:明確化を回答:正しい答えはあなたがイベントの種類を検出することができない「ごまかし」のこのタイプを実行

答えて

9

を複数のハンドラを使用していませんmu_is_too_shortで指摘したようにマークされた答えは、技術的に正しいですが、場合によってはargumentsから推論することができます。 events catalogは、これは言っている:

  • (モデル、コレクション、オプション) "追加" - モデルがコレクションに追加されたとき。
  • "リセット"(コレクション、オプション) - コレクションの内容全体が置き換えられたとき。
  • "変更"(モデル、オプション) - モデルの属性が変更されたとき。 arguments[0]がモデルとarguments[1]ある場合

    1. argumentsの内容は一意に(この場合は)トリガイベントを決定しますので、あなたのために

ラッキー、これらのイベントのすべての3つの異なるパラメータを持っていますあなたは"add"イベントを持っています。

  • arguments[0]がコレクションの場合は、"reset"イベントが発生しています。
  • arguments[0]がモデルで、arguments.lengthが2の場合、"change"というイベントがあります。

    // 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/

    、それはkludgeyで、脆弱な

  • はつまり、あなたの_setCollectionにこのような不快と脆弱な何かを行うことができますイベントの種類をリストに追加すると壊れる可能性があります。イベントハンドラがどのような種類のイベントをトリガしたのかを知る必要がある場合は、イベントタイプごとに別々のハンドラを使用する方が良いでしょう.3つの関数と3つのlistenToコールが醜いハッカーよりも優れています。

    +0

    はい、全く同意します。私はremoveイベントを見て、それをすべて1つの関数内に入れていたので、問題が見つかりました。私は議論が異なっていたことに気付き、それを質問に入れるべきだった。とにかく、あなたのハッカーのためにありがとう。私はそれぞれのハンドラを使います。 – Brandon

    関連する問題