No se puede hacer esto de la manera deseada sin necesidad de utilizar funciones no documentadas.
Si tenemos un vistazo a Collection#add
, vamos a ver esto:
add: function(models, options) {
//...
for (i = 0, l = add.length; i < l; i++) {
(model = add[i]).trigger('add', model, this, options);
}
//...
}
Nota del cuarto argumento a trigger
. Y si nos fijamos en la interfaz documentado para trigger
:
gatilloobject.trigger(event, [*args])
devoluciones de llamada de activación para el evento dado , o una lista delimitada por espacios de eventos. Los argumentos subsiguientes a activador se transmitirán a las devoluciones de llamada del evento.
Así que la add
llamará a los oyentes como f(model, collection, options)
donde options
es el mismo options
lo que pasó a Collection#add
.El resultado es que si usted hace esto:
this.collection.add(predefinedModel, { undocumented: 'arguments' })
entonces se podría hacer esto en su devolución de llamada:
triggerthis: function(model, collection, options) {
console.log(options.undocumented);
}
Demostración: http://jsfiddle.net/ambiguous/bqWwQ/
Se podría, por supuesto túnel una matriz entera o un objeto a través options
de esta manera.
El tercer argumento para "add"
eventos no está documentado (por lo menos no que yo puedo encontrar), lo más parecido a la documentación de esto es una nota en el 0.3.3 Changelog entry:
El options
argumento es ubicua ahora pasado como el argumento final para todos los eventos "change"
.
No recomendaría este enfoque, pero está ahí si lo necesita; por supuesto, deberá cubrir esto en su banco de pruebas y deberá asegurarse de no utilizar ninguna clave en el options
que Backbone vaya a utilizar.
Un enfoque más seguro sería adjuntar algunas propiedades adicionales para el modelo:
model.baggage = { some: 'extra stuff };
y luego pelar que fuera en la devolución de llamada:
triggerthis: function(model, collection) {
var baggage = model.baggage;
delete model.baggage;
//...
}
Demostración: http://jsfiddle.net/ambiguous/M3UaH/
También puede usar diferentes devoluciones de llamada para diferentes propósitos o pasar su parámetro adicional como atributos completos del modelo.
También hay _.bind
:
this.collection.on("add", _.bind(function(collection, model, extra) { ... }, context, collection, model, 'whatever you want'));
pero que se unirán los argumentos de izquierda a derecha por lo que tendrá que especificar todos los los argumentos que va a necesitar su devolución de llamada.
Demostración: http://jsfiddle.net/ambiguous/jUpJz/
Desde el 'triggerthis' controlador de eventos será llamado por el código de evento espina dorsal, ¿dónde esperas aquellos argumento extra vendrá de? –
Lo siento pero no estoy seguro de cómo funciona esto. Supongo que puedo llamar a una función anónima en() que llama a triggerthis adentro, pero no estoy seguro si esta es la buena manera de proceder. – chenglou