2012-07-03 21 views
5

Skąd wiadomo, jakie zdarzenie jest uruchamiane w kolekcji kręgosłupa podczas wiązania wielu zdarzeń do niego przy użyciu metody .on()? Zobacz następujący przykład dla wyjaśnienia. (Patrz także jsFiddle: http://jsfiddle.net/PURAU/3/)Uzyskiwanie nazw zdarzeń podczas używania funkcji .on() w przypadku wielu zdarzeń w kolekcji kręgosłupa.

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(); 

Odpowiedz

0

Musisz zastąpić metodę trigger za to, spojrzeć na kod:

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

+0

Dzięki za odpowiedź. –

+0

Komentarze do funkcji wyzwalacza w źródłach szkieletu: "Wywołaj jedno lub wiele zdarzeń, wyzwalając wszystkie powiązane wywołania zwrotne. Oddzwaniają te same argumenty, co" wyzwalacz ", oprócz nazwy zdarzenia." Nie rozumiem, dlaczego nie byłoby dobrze wysyłać nazwy wydarzenia. Czy widzisz dobry powód? –

+0

Nie tylko w przypadku "wszystkiego". –

1

Jeśli chcemy konkretnych działań na Zdarzeniem najbardziej uporządkowanym sposobem jest słuchanie każdego, także jeśli chcesz mieć ogólną zmianę słuchacza, gdy cokolwiek zmienisz, wywołaj go wewnątrz swoich słuchaczy i określ nazwę wydarzenia na sobie.

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

Dzięki za odpowiedź Daniel. Właśnie to robię, co rozwiązuje problem. Szukałem bardziej suchego rozwiązania. Wypróbowałem myGarage.on ("dodaj reset zmian", ...) i byłem zaskoczony, że nie mogłem uzyskać nazwy wydarzenia. –

+0

Domyślam się, że przesłonięcie metody wyzwalania jest jedynym rozwiązaniem, które zapewnia mi to, czego chcę. :/ –

+0

Jest lato 2015 r. I nie znam lepszej metody niż ta, ale używam Backbone tylko przez kilka miesięcy –

Powiązane problemy