Mientras que las otras respuestas lograr lo que necesitaba, que no funcionan de la manera más eficiente (escalable) , porque finalmente no desacoplan el objeto de vista (this.chart
) de la lógica de esa vista (fireEvent()
). En las aplicaciones MVC, estas "decisiones" de vista residen en un controlador . El controlador "controla" vistas y debe contener todas las API a las que puede acceder la vista.
En su ejemplo, this
es el controlador, y eso está bien (significa que está agregando sus oyentes en el lugar correcto). Todo lo que necesita hacer es obligar a la manejador al ámbito de lo que debe hacer el "manejo" - en su caso: this
:
// `this` is the controller of `chart`
this.chart.addEventListener('create', function() {
this.fireEvent('created');
}.bind(this));
Lo que las otras respuestas en esta página han hecho que se hace para que su vista se convierta en su propio controlador, pero solo mientras maneja eventos 'crear', asignando una referencia temporal al "controlador" usando var self = this
. Nuevamente, esto funciona bien, pero no funciona bien a escala en aplicaciones basadas en eventos, y realmente no tiene sentido si tiene que manejar muchos eventos.
.bind()
es una implementación de ECMAScript 5. Si es necesario trabajar en navegadores aún más antiguos, aquí se describe un buen método para hacerlo (usando functions
y .call()
): https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Function/bind
Prefiero 'var self = this;'. Crear una función y luego ejecutarla mientras pasa 'this' ya que el parámetro parece un poco por la borda; el código también es un poco más largo ;-) –
@Andy: Sí, a menudo también hago eso cuando el código existe en un contexto de ejecución pequeño. Sin embargo, lo anterior es el enfoque estándar que funciona en una variedad más amplia de escenarios.El alcance del identificador "self" está limitado solo al cierre, no hay peligro de que el código subsiguiente pueda modificar el valor contenido en él antes de que se desate el evento. Esto no es cierto para el enfoque 'var self = this;'. – AnthonyWJones