5

W grze Backbone używam nowego zdarzenia Backbone.listenTo. Jeden z moich wystąpień ma słuchacza dołączony do trzech różnych zdarzeń, np .:Jak znaleźć wyzwalane wydarzenie z kręgosłupa.listento?

this.listenTo(this._Collection, 'reset add change', this._setCollection); 

nazywana jest odpowiednio kiedy to miało i nie ma tam żadnych problemów. Nie wiem, jak się dowiedzieć, które zdarzenie zostało uruchomione. Mam dostęp do argumentu e Zastosowanie:

_setCollection: function(e) { 
    // Do fun stuff 
} 

Problem polega na tym, że e argumentem wysyła tylko kopię kolekcji i nie wspominając o jakie wydarzenie jest rzeczywiście wyzwolony. Próbowałem już e.type i e.target, ale te obiekty nie istnieją. Oto kopia obiektu e z narzędzi Chrome Dev:

_byCid: Object 
_byId: Object 
_events: Object 
    add: Array[1] 
    change: Array[1] 
    remove: Array[1] 
    reset: Array[1] 
__proto__: Object 
_listenerId: "l16" 
length: 3 
models: Array[3] 

Jak mogę znaleźć to zdarzenie zostało wywołane?

EDIT: Odpowiedź Wyjaśnienie: Chociaż wyraźna odpowiedź jest poprawna technicznie, jak podkreślił mu_is_too_short poprawną odpowiedzią jest za pomocą wielu ładowarki i nie wykonując tego typu „szykany”

Odpowiedz

9

Nie można wykryć typ zdarzenia bezpośrednio, ale w niektórych przypadkach możesz ją wyprowadzić z arguments. events catalog ma do powiedzenia:

  • "add" (model, zbieranie, opcje) - gdy model jest dodawane do kolekcji.
  • "reset" (kolekcja, opcje) - kiedy cała zawartość kolekcji została zastąpiona.
  • "zmień" (model, opcje) - kiedy atrybuty modelu uległy zmianie.

Na szczęście dla ciebie, wszystkie trzy z tych wydarzeń mają różne parametry więc zawartość arguments będzie jednoznacznie (w tym przypadku) określić zdarzenie wyzwalające:

  1. Jeśli arguments[0] jest modelem i arguments[1] jest zbiorem, a następnie masz zdarzenie "add".
  2. Jeśli arguments[0] jest zbiorem, masz wydarzenie "reset".
  3. Jeśli arguments[0] to model, a arguments.length to 2, to zdarzenie "change".

Więc można zrobić coś nieprzyjemnego i kruchy jak to w swoim _setCollection:

// M is your model, C is your collection. 
    if(arguments[0] instanceof M 
    && arguments[1] instanceof C) { 
     // An "add" event... 
    } 
    else if(arguments[0] instanceof C) { 
     // A "reset" event... 
    } 
    else if(arguments[0] instanceof M 
     && arguments.length == 2) { 
     // A "change" event... 
    } 
    else { 
     console.log('confusion!'); 
    } 

Demo: http://jsfiddle.net/ambiguous/Y9UUX/

Nie polecam tego rodzaju szykany chociaż, to jest kludgey, kruchy i może się zepsuć, jeśli dodasz więcej typów zdarzeń do listy.Jeśli Twój program obsługi zdarzeń musi wiedzieć, jakie zdarzenie wywołało to, lepiej byłoby użyć oddzielnych procedur obsługi dla każdego typu zdarzenia: trzy funkcje i trzy połączenia listenTo są lepsze niż mała kupa brzydkiego hackery.

+0

Tak, całkowicie się zgadzam. Znalazłem problem, ponieważ patrzyłem na zdarzenie remove i zawierałem je wszystkie w ramach jednej funkcji. Zauważyłem, że argumenty są odmienne i powinny to wyjaśnić. W każdym razie, dzięki za twój hackery. Użyję dla każdego różnych programów obsługi. – Brandon

Powiązane problemy