Mentre le altre risposte realizzare quello che avevi bisogno, che non funzionano nel modo più efficiente (scalabile) , perché in definitiva non disaccoppiano l'oggetto vista (this.chart
) dalla logica di quella vista (fireEvent()
). Nelle applicazioni MVC, queste "decisioni" vengono visualizzate in un controller . Il controller "controlla" le viste e dovrebbe contenere tutte le API a cui la vista può accedere.
Nel tuo esempio, this
è il controller, e va bene (vuol dire che stai aggiungendo gli ascoltatori nel posto giusto). Tutto ciò che dovete fare è associare il gestore per la portata della cosa che dovrebbe fare il "trattamento" - nel vostro caso: this
:
// `this` is the controller of `chart`
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}.bind(this));
Quali le risposte su questa pagina hanno fatto è reso quindi la visualizzazione diventa il proprio controller, ma solo durante la gestione degli eventi di 'creazione', assegnando un riferimento temporaneo al "controller" utilizzando var self = this
. Di nuovo, questo funziona bene, ma non funziona bene su larga scala in applicazioni event-driven, e non ha senso se si hanno molti eventi da gestire.
.bind()
è un'implementazione di ECMAScript 5. Se è necessario lavorare anche con i browser più vecchi, qui viene descritto un buon metodo (utilizzando functions
e .call()
): https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind
Preferisco 'var auto = this;'. Creare una funzione e poi eseguirla mentre si passa 'this' come il parametro sembra un po 'fuori bordo - il codice è leggermente più lungo ;-) –
@Andy: Sì lo faccio spesso anche quando il codice esiste in un contesto di esecuzione ridotto. Tuttavia, quanto sopra è l'approccio standard che funziona in una più ampia varietà di scenari.Lo scopo dell'identificatore 'self' è limitato solo alla chiusura, non c'è pericolo che il codice successivo possa modificare il valore contenuto in esso prima che l'evento venga attivato. Questo non è vero per l'approccio 'var self = this;'. – AnthonyWJones