5

In Backbone, sto usando il nuovo evento Backbone.listenTo. Uno dei miei casi ha l'ascoltatore attaccato a tre diversi eventi ad es .:Come trovare l'evento attivato da Backbone.listenTo?

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

Si chiama in modo appropriato quando si suppone che e non ci sono problemi lì. Quello che non so è come scoprire quale evento è stato attivato. Ho accesso alla tesi e utilizzando:

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

Il problema è che l'argomento e invia solo una copia della raccolta e non menziona quale evento viene effettivamente attivato. Ho provato e.type e e.target ma questi oggetti non esistono. Ecco una copia dell'oggetto e dagli strumenti 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] 

Come posso trovare ciò evento è stato attivato?

EDIT: Risposta Precisazione: Anche se la risposta marcata è tecnicamente corretto, come ha sottolineato mu_is_too_short la risposta corretta sta usando più gestori e non eseguire questo tipo di "cavilli"

risposta

9

Non è in grado di rilevare il tipo di evento direttamente ma, in alcuni casi, è possibile dedurlo da arguments. Il events catalog ha questo da dire:

  • "add" (modello, raccolta, opzioni) - quando un modello viene aggiunto a una raccolta.
  • "reset" (raccolta, opzioni) - quando l'intero contenuto della raccolta è stato sostituito.
  • "cambia" (modello, opzioni) - quando gli attributi di un modello sono cambiati.

Fortunatamente per voi, tutti e tre di questi eventi hanno parametri diversi in modo che il contenuto di arguments saranno univocamente (in questo caso) determinano l'evento scatenante:

  1. Se arguments[0] è un modello e arguments[1] è una raccolta quindi hai un evento "add".
  2. Se arguments[0] è una raccolta, si ha un evento "reset".
  3. Se arguments[0] è un modello e arguments.length è 2, si ha un evento "change".

modo da poter fare qualcosa di spiacevole e fragile come questo nel tuo _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/

io non consiglierei questa sorta di cavillo però, è kludgey, fragile e può interrompersi se aggiungi altri tipi di eventi all'elenco.Se il gestore di eventi ha bisogno di sapere quale tipo di evento l'ha attivato, allora sarebbe meglio usare gestori separati per ogni tipo di evento: tre funzioni e tre chiamate listenTo sono meglio di una piccola pila di brutto scherzo.

+0

Sì, totalmente d'accordo. Ho trovato il problema perché stavo guardando l'evento remove e contenendolo tutto all'interno di una funzione. Avevo notato che gli argomenti erano diversi e dovevo metterlo nella domanda. Ad ogni modo, grazie per la tua hackery. Userò diversi gestori per ciascuno. – Brandon

Problemi correlati