2012-06-24 17 views
14

まず、私はいくつかの検索を行いました。バックボーンのイベントへの引数の受け渡し

は、ここに私のコードの抜粋です:

//in the view 
this.collection.on("add",triggerthis) 
this.collection.add(predefinedModel) 
triggerthis: function(a, b, c, d){ 
    //etc. 
} 

は基本的に、私は追加の引数を渡すとtriggerthisで引数を受け取ることができるようにしたいです。これは可能ですか?

ありがとうございます。

+1

、? –

+0

申し訳ありませんが、私はどのようにこの作品がわかりません。私は、内部でtriggerを呼び出すon()の無名関数を呼び出すことができると思いますが、これが良い方法であるかどうかはわかりません。 – chenglou

答えて

30

あなたは文書化されていない機能を使用しなくても、あなたが望むようにこれを行うことはできません。

我々はCollection#addを見てみると、私たちはこの表示されます:

add: function(models, options) { 
    //... 
    for (i = 0, l = add.length; i < l; i++) { 
    (model = add[i]).trigger('add', model, this, options); 
    } 
    //... 
} 

triggerの4番目の引数に注意してください。そして、私たちはtriggerのための文書化インタフェースを見れば:与えられたイベント、またはイベントのスペースで区切られたリストのための

トリガーをobject.trigger(event, [*args])

トリガーのコールバック。 トリガーの引き続く引数は、イベントコールバックに渡されます。

のでaddoptionsはあなたがCollection#addに渡されたものを同じoptionsあるf(model, collection, options)としてリスナーを呼び出します。

this.collection.add(predefinedModel, { undocumented: 'arguments' }) 

その後、あなたはコールバックでこれを行うことができます:結果は、あなたがこれを行う場合ということです

triggerthis: function(model, collection, options) { 
    console.log(options.undocumented); 
} 

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

あなたは可能性があり、もちろんトンネルの配列全体またはオブジェクトを介してoptionsこの方法。

ユビキタスoptions引数は以下のようになります。

"add"イベントのための第三引数は、(少なくとも私は見つけることができること)、このための文書に最も近いものは0.3.3 Changelog entryでノートがあり、文書化されていませんすべての"change"イベントに最終的な引数として渡されます。

私はこのアプローチをお勧めしませんが、必要に応じてそこにあります。もちろん、これをテストスイートでカバーする必要があり、バックボーンが使用するoptionsのキーを使用しないようにする必要があります。

model.baggage = { some: 'extra stuff }; 

、その後、コールバックでそれをはがし:

triggerthis: function(model, collection) { 
    var baggage = model.baggage; 
    delete model.baggage; 
    //... 
} 

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


より安全なアプローチは、モデルにいくつかの余分な性質を付けることであろう

異なる目的のために異なるコールバックを使用することもできますし、余分なパラメータを渡すこともできます完全なモデル属性として吹き飛ばす。

あり_.bindもあります:

this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want')); 

しかし、あなたはあなたのコールバックが必要になりますすべての引数を指定する必要がありますので、それは左から右に引数をバインドします。

デモ:あなたはそれらの余分の引数から来る期待しますhttp://jsfiddle.net/ambiguous/jUpJz/ `triggerthis`イベントハンドラがバックボーンイベントコードによって呼び出されますので

+0

upvote - 手荷物のようなテクニック - うまくいきます!どうも – sambomartin

6

関数に渡された値が常に同じであれば、あなたは(利用可能な場合またはネイティブFunction.bind_.bindを使用して、それをpartially applyでき

例えばあなたはaddにハンドラをバインドしている場合は(triggerThisと仮定すると、あなたのビュー内のメソッドである):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d)); 

triggerThisの定義:

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) { 
    ... 
} 

はあなたが個々に引数を渡したい場合は2番目のoptionsパラメータをaddに使用し、それをイベントハンドラで処理することができます。

など。

あなたのハンドラで次に
this.collection.on('add', this.triggerThis, this); 
this.collection.add(model, { 
    someCustomValue: 'hello'; 
}); 

triggerThis: function(model, collection, options) { 
    var val = options.someCustomValue; 
    ... 
} 
+0

問題は、第3の 'options'引数が正確に文書化されていないことです。 –

+0

True、changelogエントリ(0.9.0)の1つに、「コレクションの追加イベントと削除イベント内で、追加または削除されるモデルのインデックスがoptions.indexとして利用可能になりました」と記載されています。だから私はおそらくすぐに外に出ることはないだろうと思う。 – jimr

+0

コールバックの 'options'引数は、グレーの領域のようなものです。私はそれがある時点で正当化されると思う。私はちょっとした注意点があることに言及する価値があったのですが。 –

関連する問題