Non si può fare questo nel modo desiderato senza l'utilizzo di funzioni non documentate.
Se abbiamo uno sguardo a Collection#add
, vedremo questo:
add: function(models, options) {
//...
for (i = 0, l = add.length; i < l; i++) {
(model = add[i]).trigger('add', model, this, options);
}
//...
}
Nota il quarto argomento a trigger
. E se guardiamo l'interfaccia documentata per trigger
:
grillettoobject.trigger(event, [*args])
callback innesco per la data dell'evento , o un elenco delimitato da spazi di eventi. Gli argomenti successivi al trigger verranno inoltrati ai callback dell'evento.
Così il add
chiamerà gli ascoltatori come f(model, collection, options)
dove options
è lo stesso options
quello che hai passato a Collection#add
.Il risultato è che, se si esegue questa operazione:
this.collection.add(predefinedModel, { undocumented: 'arguments' })
allora si potrebbe fare questo nel vostro callback:
triggerthis: function(model, collection, options) {
console.log(options.undocumented);
}
Demo: http://jsfiddle.net/ambiguous/bqWwQ/
Si potrebbe naturalmente tunnel tutta una serie o un oggetto attraverso options
in questo modo.
Il terzo argomento per "add"
eventi non è documentato (almeno non che io riesco a trovare), la cosa più vicina alla documentazione per questo è una nota nella 0.3.3 Changelog entry:
Il options
argomento onnipresente è ora passato come argomento finale a tutti gli eventi "change"
.
Non consiglierei questo approccio ma è lì se ne avete bisogno; Ovviamente dovrai copiarlo nella tua suite di test e dovrai assicurarti di non utilizzare alcuna chiave in options
che verrà utilizzata da Backbone.
un approccio più sicuro sarebbe quello di collegare alcune proprietà in più per il modello:
model.baggage = { some: 'extra stuff };
e poi buccia che fuori nella richiamata:
triggerthis: function(model, collection) {
var baggage = model.baggage;
delete model.baggage;
//...
}
Demo: http://jsfiddle.net/ambiguous/M3UaH/
Puoi anche utilizzare diversi callback per scopi diversi o passare il tuo parametro aggiuntivo come attributi del modello in piena regola.
C'è anche _.bind
:
this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));
ma che legherà gli argomenti da sinistra a destra in modo da dovrete specificare tutti gli argomenti che il callback avrà bisogno.
Demo: http://jsfiddle.net/ambiguous/jUpJz/
Dal momento che il gestore triggerthis' 'evento sarà chiamato dal codice evento spina dorsale, dove si aspetta coloro argomento extra verrà da? –
Scusa ma non sono sicuro di come funzioni. Suppongo di poter chiamare una funzione anonima in on() che chiama triggerthis all'interno, ma non sono sicuro se questo è il modo migliore per procedere. – chenglou