2012-07-03 14 views
5

¿Cómo puedo saber qué evento se desencadena en una colección de red troncal cuando se unen varios eventos utilizando .on()? Vea el siguiente ejemplo para aclaración. (Véase también la jsFiddle: http://jsfiddle.net/PURAU/3/)Obteniendo nombres de eventos cuando se utiliza .on() para múltiples eventos en una colección Backbone.

var Car = Backbone.Model.extend({ 
    nrOfWheels: 4, 
    color: 'red', 
    speed: 'slow' 
}); 

var Garage = Backbone.Collection.extend({ 
    model: Car 
}); 

var myGarage = new Garage(), 
    myCar = new Car(); 

myGarage.on('add change reset', function() { 
    // How do I know what event was triggered? 
    console.log('add change reset', arguments); 
}); 

myGarage.on("all", function() { 
    // In here, the name of the event is the first argument. 
    console.log('all', arguments); 
}); 

// Trigger add 
myGarage.add(myCar); 

// Trigger change 
myCar.set('speed', 'fast'); 

// Trigger reset 
myGarage.reset(); 

Respuesta

0

que necesitará reemplazar el método trigger para hacerlo, echar un vistazo al código:

https://github.com/documentcloud/backbone/blob/master/backbone.js#L148

+0

Gracias por su respuesta. –

+0

Los comentarios sobre la función desencadenante en la fuente Backbone indican "desencadenar uno o más eventos, disparando todas las devoluciones de llamada. Las rellamadas reciben los mismos argumentos que 'trigger', además del nombre del evento." No veo por qué no sería bueno enviar siempre el nombre del evento. ¿Ves una buena razón? –

+0

No solo en el caso del evento 'todos'. –

1

Si queremos acciones específicas por El modo más ordenado es escuchar cada uno, también si desea tener un oyente de cambio general cuando cualquier cosa cambie, llámelo dentro de sus oyentes y especifique el nombre del evento en usted mismo.

myGarage.on('add', function() { 
    yourGlobalFunction(arguments, 'add'); 
    //specific actions for add 
}); 
myGarage.on('change', function() { 
    yourGlobalFunction(arguments, 'change'); 
    //specific actions for change 
}); 
myGarage.on('reset', function() { 
    yourGlobalFunction(arguments, 'reset'); 
    //specific actions for reset 
}); 

function yourGlobalFunction(prevArguments, eventName){ 
    log(prevArguments, eventName); 
} 
+2

Gracias por su respuesta Daniel. Esto es lo que hago actualmente, que resuelve el problema en cuestión. Estaba buscando una solución más SECA. Intenté myGarage.on ('agregar cambio de reinicio', ...) y me sorprendió que no pudiera obtener el nombre del evento. –

+0

Creo que anular el método de activación es la única solución que me da lo que quiero. :/ –

+0

Es verano de 2015 y no sé de una mejor manera que esto, pero solo he estado usando Backbone por un par de meses –

Cuestiones relacionadas