2012-06-24 10 views
14

Primero de todo, hice algunas búsquedas y ninguna respuesta en stackoverflow/google me proporcionó lo que quería.Pasando argumentos a eventos en la red troncal

He aquí un fragmento de mi código:

//in the view 
this.collection.on("add",triggerthis) 
this.collection.add(predefinedModel) 
triggerthis: function(a, b, c, d){ 
    //etc. 
} 

Básicamente, quiero ser capaz de pasar un argumento en complemento y recibir el argumento de triggerthis. es posible?

Gracias de antemano.

+1

Desde el 'triggerthis' controlador de eventos será llamado por el código de evento espina dorsal, ¿dónde esperas aquellos argumento extra vendrá de? –

+0

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

Respuesta

30

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/

+0

upvote - como la técnica del equipaje - ¡funciona bien! Gracias – sambomartin

6

Si los valores pasados ​​a la función son siempre los mismos, puede partially apply usando _.bind (o el nativo Function.bind si está disponible)

P. ej ¿Dónde está la unión del manejador de add (suponiendo triggerThis es un método en su opinión):

this.collection.on('add', _.bind(this.triggerThis, this, a, b, c, d)); 

La definición de triggerThis:

triggerThis: function(a, b, c, d /*, model, collection, options - if you need them*/) { 
    ... 
} 

Si quieren pasar argumentos a un individuo agregar llamada, puede usar el segundo parámetro options en add y luego manejar eso en su controlador de eventos.

E.g.

this.collection.on('add', this.triggerThis, this); 
this.collection.add(model, { 
    someCustomValue: 'hello'; 
}); 

A continuación, en el controlador:

triggerThis: function(model, collection, options) { 
    var val = options.someCustomValue; 
    ... 
} 
+0

El problema es que el tercer argumento 'options' no está exactamente documentado. –

+0

Es cierto, aunque en una de las entradas de registro de cambios (para 0.9.0) se menciona que "Dentro de una colección agregar y eliminar eventos, el índice del modelo que se agrega o elimina ahora está disponible como options.index". así que supongo que probablemente no desaparecerá pronto. – jimr

+0

El argumento de 'opciones' para las devoluciones de llamada es una especie de área gris, el tipo de documentos habla de ello sin decir que está allí. Sospecho que se legitimará en algún momento. Solo pensé que valía la pena mencionar que hay algunas advertencias. –

Cuestiones relacionadas