14

まず第一に、私はいくつかの検索を行いましたが、stackoverflow/google で答えが得られませんでした。

これが私のコードのスニペットです:

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

基本的にはaddで引数を渡し、triggerthisで引数を受け取れるようにしたいです。これは可能ですか?

前もって感謝します。

4

2 に答える 2

30

文書化されていない機能を使用しないと、これを思い通りに行うことはできません。

を見ると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と同じように呼び出します。これを行うと、結果は次のようになります。optionsCollection#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/

于 2012-06-24T01:49:19.817 に答える
6

関数に渡される値が常に同じである場合は、 (または可能な場合はネイティブ)を使用して部分的に適用できます。_.bindFunction.bind

例:ハンドラーをバインドしている場所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*/) {
  ...
}

個々のadd呼び出しに引数を渡したい場合は、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;
  ...
}
于 2012-06-24T01:42:55.593 に答える