2011-08-04 6 views
7

Jak uzyskać dostęp do zakresu klasy, a także funkcji?Coffeescriptowe klasy i zakresy oraz cienkie i cienkie strzałki

przykład:

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

Tak więc w tym przykładzie, w przypadku korzystania z => to @ odnosi się do tego klasy, ale „to” jest wtedy tak, natomiast w przypadku korzystania z -> dla każdego, to "to" jest poprawnie określone, ale jak mogę się odwołać do paska funkcji klasy?

Dzięki!

+0

Znalazłem rozwiązanie tymczasowe: Używając paska ->, a następnie odwołującego, używając Przykładu :: pasek. Działa, ale jest brzydka. Ktoś ma jakieś ładniejsze rozwiązania? –

Odpowiedz

10

To dlatego, że w coffeescript @ jest aliasem dla this czyli kiedy skompilować .coffee do js @ zostaną zastąpione this.

Jeśli brzydkie jest Example::bar, nie sądzę, że istnieją "ładniejsze" rozwiązania.

można przechowywać odniesienie do this przed wywołaniem .each:

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

Dzięki mak. Dobra odpowiedź. Pokazano, że nie przeoczyłem czegoś oczywistego, a także podoba mi się opcja self = @. Powinienem był o tym pomyśleć. Nadal się do tego przyzwyczajam, ale lubię to. –

+0

W oddzielnej notatce (stylu), co sądzisz o składni ($ '.foo') zamiast $ ('. Foo')? Topfunky próbował przeforsować pierwszy styl, ale jestem niezdecydowany ... –

+0

Osobiście uważam, że $ (".foo") jest łatwiejszy do odczytania. – mak

16

Podczas mak ma rację, nie uda mu się zwrócić uwagę, że w coffeescript rzadko potrzebują each metody jQuery, która, jak zauważył, stemple swoje kontekst wykonania w twarz bez Twojej zgody. przelotowe cechy

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

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

Coffee script wspierać koncepcję each bez rzeczywistego kodu niestandardowego biblioteki w ogóle. Nie generują też nowego zakresu ani kontekstu, co oznacza, że ​​nie potrzebujesz żadnej grubej strzały.

+0

Dobre rzeczy Squeegy! Masz całkowitą rację. Pozostawiłem odpowiedź mak jako zaakceptowaną, ale twoja droga jest o wiele lepsza - i do zrobienia. Wrzuciłem do coffeescript z konwersją niektórych starych js i właśnie dlatego trafiłem na ten problem, ale teraz wiem lepiej. Dzięki. –

3

Po sprawdzeniu innego rozwiązania. Tutaj coś pojawia się dla mnie jako najbardziej kompletna próbka z każdym i kliknij:

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))