文書化されていない機能を使用しないと、これを思い通りに行うことはできません。
を見るとCollection#add
、次のようになります。
add: function(models, options) {
//...
for (i = 0, l = add.length; i < l; i++) {
(model = add[i]).trigger('add', model, this, options);
}
//...
}
の 4 番目の引数に注意してくださいtrigger
。そして、文書化されたインターフェースを見るとtrigger
:
引き金 object.trigger(event, [*args])
指定されたevent、またはスペースで区切られたイベントのリストのコールバックをトリガーします。トリガーへの後続の引数は、イベント コールバックに渡されます。
そのため、add
はリスナーをf(model, collection, options)
whereに渡したものoptions
と同じように呼び出します。これを行うと、結果は次のようになります。options
Collection#add
this.collection.add(predefinedModel, { undocumented: 'arguments' })
次に、コールバックでこれを行うことができます:
triggerthis: function(model, collection, options) {
console.log(options.undocumented);
}
デモ: http://jsfiddle.net/ambiguous/bqWwQ/
もちろん、この方法で配列全体またはオブジェクトをトンネリングすることもできますoptions
。
イベントの 3 番目の引数"add"
は文書化されていません (少なくとも私が見つけることはできません)。これに関する文書に最も近いものは、0.3.3 Changelog エントリのメモです。
どこにでもある引数は、すべてのイベントoptions
の最終引数として渡されるようになりました。"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/