如果不使用未记录的功能,您将无法以您想要的方式执行此操作。
如果我们看一下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)
whereoptions
与options
您传递给的内容相同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"
事件的最终参数传递。
我不推荐这种方法,但如果你需要它就在那里;您当然需要在您的测试套件中涵盖这一点,并且您需要确保您不使用options
Backbone 将使用的任何键。
一种更安全的方法是为模型附加一些额外的属性:
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/