2011-10-10 10 views
6

Soy nuevo en coffeescript y me preguntaba si hay una manera de escribir el siguiente fragmento de código sin hacer referencia a la aplicación variable global:referencia a la clase padre en CoffeeScript de una devolución de llamada jQuery

class App 

    constructor: -> 
     @ui = ui.init() 
     $('#content-holder a[rel!=dialog]').live 'click', -> 
      link = $(@).attr 'href' 
      app.loadUrl link 
      return false 

    loadUrl: (href) -> 
     # ... 

app = new App() 

con la grasa flecha no trabajar, como entonces pierdo referencia al objeto jQuery, es decir

class App 
    constructor: -> 
     @ui = ui.init() 
     $('#content-holder a[rel!=dialog]').live 'click', => 
      # @ now references App 
      link = $(@).attr 'href' 
      this.loadUrl link 
      return false 

    loadUrl: (href) -> 
     # ... 

la primera pieza de código funciona, pero yo quiero para deshacerse de la variable global, si es posible :-)

Cheers, Gaz.

+0

Ha intentado '@loadUrl link' en lugar de 'this.loadUrl' Si eso no funciona, publique el javascript compilado. – Gazler

+1

@ algo es solo un azúcar sintáctico para esto. Algo, afaik – Guard

+0

Eso no funcionará, porque @ (esto) se referirá a la función de devolución de llamada anónima. – Gaz

Respuesta

10

Su controlador de clic obtiene un evento pasado en ... para que pueda obtener lo mejor de ambos mundos con la "flecha de grasa" sin la necesidad de hacer referencia también self:

constructor: -> 
    @ui = ui.init() 
    $('#content-holder a[rel!=dialog]').live 'click', (e) => 
     link = $(e.target).attr 'href' 
     @loadUrl link 
     return false 
+0

Cheeky, me gusta! – Gaz

+1

'e.href' también funciona – mirelon

+0

En realidad tenía la flecha 'grasa', pero no pude obtener el elemento en el que hice clic =) thx –

5

Bueno, CS es simplemente una sintaxis de nivel superior para JS.

En JS this solo se puede hacer referencia a un solo objeto.

La flecha de grasa utiliza el cierre de hacer this igual a un nivel más alto this, nada más, y es por eso que anula this alcance de una llamada de retorno

La flecha sencilla, en cambio, se encuentra a function alias y es por eso que this es un elemento DOM en el primer caso.

Finalmente, @something se traduce trivialmente a this.something, y no hace nada más.

Por lo tanto, mi opinión: su mejor opción es realmente hacer self = @ antes de la unión.

+1

Gracias Guardia. Pensé que CoffeeScript podría tener algo mágico que podría ser capaz de evitar tirar basura por todo el lugar :-) – Gaz

+0

@Gaz En realidad, hay una mejor manera. Ver mi respuesta. –

+0

+1 para la "flecha de grasa utiliza el cierre para hacer que esto sea igual a un nivel superior", ya que es la primera vez que entendí la importancia después de 3 días aprendiendo CS. – Josh

Cuestiones relacionadas