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);
  }
  //...
}

注意 的第四个参数trigger。如果我们查看文档化的接口trigger

扳机 object.trigger(event, [*args])

触发给定事件的回调,或以空格分隔的事件列表。触发的后续参数将传递给事件回调。

因此,add将调用侦听器,因为f(model, collection, options)whereoptionsoptions您传递给的内容相同Collection#add。结果是,如果你这样做:

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

那么你可以在你的回调中这样做:

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

演示:http: //jsfiddle.net/ambiguous/bqWwQ/

您当然可以通过options这种方式隧道整个数组或对象。

事件的第三个参数"add"没有记录(至少我找不到),与文档最接近的是0.3.3 Changelog 条目中的注释:

无处不在的options参数现在作为所有"change"事件的最终参数传递。

我不推荐这种方法,但如果你需要它就在那里;您当然需要在您的测试套件中涵盖这一点,并且您需要确保您不使用optionsBackbone 将使用的任何键。


一种更安全的方法是为模型附加一些额外的属性:

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 调用,可以使用第二个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 回答