Je kunt dit niet op de gewenste manier doen zonder ongedocumenteerde functies te gebruiken.
Als we kijken naar Verzameling # toevoegen
, Ik zal dit zien:
add: function(models, options) {
//...
for (i = 0, l = add.length; i < l; i++) {
(model = add[i]).trigger('add', model, this, options);
}
//...
}
Noteer het vierde argument voor trigger
. En als we kijken naar de gedocumenteerde interface voor trigger
:
trigger object.trigger (event, [* args])
Start callbacks voor de gegeven event of door spaties gescheiden lijst met events. Latere argumenten voor trigger worden doorgegeven aan de callbacks van gebeurtenissen.
Dus de toevoegen
roept de luisteraars op als f (model, verzameling, opties)
waarbij opties
dezelfde opties
is wat u hebt doorgegeven aan Verzameling # voeg
toe. Het resultaat is dat als je dit doet:
this.collection.add(predefinedModel, { undocumented: 'arguments' })
dan zou je dit in je callback kunnen doen:
triggerthis: function(model, collection, options) {
console.log(options.undocumented);
}
Demo: http://jsfiddle.net/ambiguous/bqWwQ/
Natuurlijk kunt u op deze manier een hele array of object doorvoeren via opties
.
Het derde argument voor "add"
-gebeurtenissen is niet gedocumenteerd (althans niet dat ik kan vinden), het dichtste bij documentatie hiervoor is een notitie in de 0.3.3 Changelog-vermelding :
Het alom aanwezige opties
-argument wordt nu doorgegeven als het laatste argument voor alle "change"
-gebeurtenissen.
Ik zou deze benadering niet aanbevelen, maar het is er als je het nodig hebt; u zult dit natuurlijk in uw testsuite moeten bespreken en u moet ervoor zorgen dat u geen toetsen gebruikt in opties
die Backbone zal gebruiken.
Een veiligere benadering zou zijn om wat extra eigenschappen aan het model toe te voegen:
model.baggage = { some: 'extra stuff };
en verwijder dat vervolgens in de callback:
triggerthis: function(model, collection) {
var baggage = model.baggage;
delete model.baggage;
//...
}
Demo: http://jsfiddle.net/ambiguous/M3UaH/
U kunt ook verschillende callbacks gebruiken voor verschillende doeleinden of uw extra parameters doorgeven als volledig opgeblazen modelattributen.
Er is ook _. Bind
:
this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));
maar dat zal argumenten van links naar rechts binden, dus je moet alles de argumenten opgeven die je callback nodig heeft.
Demo: http://jsfiddle.net/ambiguous/jUpJz/