2011-08-04 17 views
7

En una función de flecha gruesa de una clase coffeescript, ¿cómo puedo acceder al alcance de la clase así como a la función?Clases de Coffeescript y alcance y flechas gruesas y delgadas

Ejemplo:

class Example 
    foo: -> 
    $('.element').each => # or -> 
     @bar($(this))  # I want to access 'bar' as well as the jquery element 
    bar: (element) -> 
    element.hide() 

lo tanto, en este ejemplo, si uso un => entonces el @ se refiere al este de la clase, pero el 'esto' es entonces mal, mientras que si uso un -> para cada uno, entonces 'this' tiene el alcance correcto, pero ¿cómo hago referencia a la barra de función de clase?

Gracias!

+0

He encontrado una solución temporal: utilizando un -> y haciendo referencia a la barra usando Example :: bar. Funciona pero es feo. Alguien tiene soluciones más bonitas? –

Respuesta

10

Eso es porque en CoffeeScript @ es un alias para this es decir, cuando se compila el .coffee a .js @ será reemplazado por this.

Si Example::bar es feo, no creo que haya soluciones 'más bonitas'.

Puede almacenar una referencia a this antes de llamar .each:

class Example 
    foo: -> 
    self = @ 
    $('.element').each -> 
     self.bar($(this)) # or self.bar($(@)) 
    bar: (element) -> 
    element.hide() 
+0

Gracias mak. Buena respuesta. Se muestra que no me he perdido algo obvio y también me gusta la opción self = @. Debería haber pensado en eso. Todavía me estoy acostumbrando, pero me gusta. –

+0

En una nota separada (de estilo), ¿qué piensas de la sintaxis ($ '.foo') en lugar de $ ('. Foo')? Topfunky estaba tratando de impulsar el primer estilo, pero estoy indeciso ... –

+0

Personalmente encuentro $ ('. Foo') más fácil de leer. – mak

16

Mientras MAK es correcto, él no puede señalar que en la escritura de café que rara vez se necesita método de jQuery each, que como se ha notado, perfora su contexto de ejecución en la cara sin su permiso. características de bucle

class Example 
    foo: -> 
    for element in $('.element') 
     @bar $(element) 

    bar: (element) -> 
    element.hide() 

de coffeescript apoyan el concepto de each sin ningún código real biblioteca personalizada en absoluto. Y tampoco generan un nuevo ámbito o contexto, lo que significa que no necesitas una flecha grande de ningún tipo.

+0

¡Buenas cosas Squeegy! Tienes toda la razón. Dejé la respuesta de mak como aceptada, pero tu camino es mucho más ordenado, y el camino a seguir. Me lancé al coffeescript con una conversión de algunos js antiguos, por lo que habría solucionado este problema, pero ahora lo sé mejor. Gracias. –

3

Después de comprobar la solución diferente. Aquí aparece algo para mí como la muestra más completa con cada uno y haga clic en:

class MainApp 
    self = [] 

    constructor: -> 
    self = @ 

    toDoOnClick: (event) -> 
    self.bar($(event.target)) #hide the clicked object 

    bar: (element) -> 
    element.hide() 

    sampleMethod:-> 
    $(".myDiv").click (e) -> self.toDoOnClick(e) 
    $('.element').each -> 
     self.bar($(this))