2012-07-03 20 views
5

Come faccio a sapere quale evento viene attivato su una raccolta Backbone quando si collegano più eventi utilizzando .on()? Vedi il seguente esempio per chiarimenti. (Si veda anche il jsFiddle: http://jsfiddle.net/PURAU/3/)Ottenere i nomi degli eventi quando si utilizza .on() per più eventi in una raccolta 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(); 

risposta

0

sarà necessario eseguire l'override del metodo trigger per farlo, hanno uno sguardo al codice:

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

+0

Grazie per la risposta. –

+0

I commenti sulla funzione di trigger negli stati sorgente Backbone "Attivano uno o più eventi, attivando tutti i callback associati. Le callback vengono passate gli stessi argomenti di" trigger ", a parte il nome dell'evento." Non vedo perché non sarebbe bello inviare sempre il nome dell'evento. Vedi una buona ragione? –

+0

Non solo nel caso di evento 'tutti'. –

1

Se vogliamo azioni specifiche per l'evento il modo più ordinato è quello di ascoltarli tutti, anche se si desidera avere un listener di modifiche generali quando qualcosa cambia, chiamarlo all'interno degli ascoltatori e specificare il nome dell'evento su se stessi.

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

Grazie per la risposta, Daniel. Questo è ciò che faccio attualmente, il che risolve il problema in questione. Stavo cercando una soluzione più ASCIUTTA. Ho provato myGarage.on ('aggiungi modifica reset', ...) e sono rimasto sorpreso dal fatto che non sono riuscito a ottenere il nome dell'evento. –

+0

Immagino che sovrascrivere il metodo di trigger sia l'unica soluzione che mi fa ottenere ciò che voglio. :/ –

+0

È estate 2015 e non conosco un modo migliore di questo, ma ho usato solo Backbone per un paio di mesi –