2012-04-12 5 views
5

Szukasz eleganckiego rozwiązania wspólnego problemu:coffeescript - zachowanie kontekstu klasy i kontekst zdarzeń

mam klasę, która subskrypcji kilku zdarzeń, chcę handler być metoda instancji w mojej klasie, ale także chcesz uzyskać kontekst zdarzenia (element, w którym wywołano zdarzenie w tym przypadku).

Używam składni linii tłuszczu dla definicji metody, ale nie mam sposobu, aby uzyskać kontekst zdarzenia. Żeby być konkretnym, używam raphael js i gdy subskrybuję element, obiekt zdarzenia nie zawiera elementu, tylko element dom, więc bez kontekstu zdarzenia będę musiał przeszukać element przez jego id raphael wewnątrz papieru, a ja nie lubię tego.

Jaka jest najlepsza praktyka w tym przypadku? Obecnie tworzę nowy obiekt kontekstu przed każdym subskrybowaniem zdarzenia, kontekst zawiera odwołanie do instancji i odwołanie do elementu.

Odpowiedz

5

Jeśli dobrze rozumiem, chcesz zachować odniesienia do kontekstów związanych i niezwiązanych w funkcji obsługi. Możesz to osiągnąć ręcznie robiąc coś podobnego do tego, co robi tłusta strzała:

class TheListenerObject 
    constructor: -> 
    context = @ # some people may call it `self` 
    @theHandlerMethod =() -> 
     referenceToTheListenerObjectInstance = context 
     referenceToTheUnboundContext = @ 
+0

To jest typowe rozwiązanie ... będzie działać, ale w środku jest trochę magii. kontekst zostanie opakowany za pomocą metody obsługi w nowym anonimowym obiekcie dla każdego uruchomienia tego kodu. (jako charakter js) szukam czystszego sposobu, jeśli istnieje. jak powiedziałem, stworzyłem kontekst wewnątrz programu obsługi, aby uniknąć tego problemu. –

+1

@ChenKinnrot to lepiej podać przykłady kodu. Bardzo trudno zrozumieć, czego dokładnie chcesz i co już osiągnąłeś. Jedno, co mogę powiedzieć na pewno, to to, że jeśli chcesz, aby funkcja odwoływała się do jakiegoś obiektu z zewnętrznego zakresu, nieuchronnie będziesz musiał w pewnym momencie zamknąć go w zamknięciu i wtedy funkcja będzie redeclared dla każdego nowego kontekstu. Tu nie ma żadnej magii, tylko javascript. –

+0

nie mógł lepiej w lepszy sposób, dzięki. –