2011-08-04 18 views
7

एक कॉफ़ीस्क्रिप्ट क्लास के वसा तीर वाले फ़ंक्शन में, मैं कक्षा के साथ-साथ फ़ंक्शन के दायरे तक कैसे पहुंच सकता हूं?कॉफ़ीस्क्रिप्ट क्लास और स्कोप और वसा और पतले तीर

उदाहरण:

class Example 
    foo: -> 
    $('.element').each => # or -> 
     @bar($(this))  # I want to access 'bar' as well as the jquery element 
    bar: (element) -> 
    element.hide() 
इस उदाहरण में

तो, अगर मैं एक => तो @ वर्ग की इस लेकिन के लिए संदर्भित करता का उपयोग 'यह' तो गलत है, जबकि अगर मैं का उपयोग एक -> प्रत्येक के लिए, फिर 'यह' सही ढंग से स्कॉप्ड होता है लेकिन फिर मैं कक्षा फ़ंक्शन बार का संदर्भ कैसे ले सकता हूं?

धन्यवाद!

+0

मुझे एक अस्थायी समाधान मिला है: एक -> का उपयोग करना और फिर उदाहरण :: बार का उपयोग करके बार का संदर्भ देना। यह काम करता है लेकिन यह बदसूरत है। किसी के पास कोई सुंदर समाधान है? –

उत्तर

10

ऐसा इसलिए है क्योंकि CoffeeScript @ में this अर्थात के लिए एक उपनाम है जब आप .js करने के लिए अपने .coffee संकलन है @this से बदल दिया जाएगा।

यदि Example::bar बदसूरत है, तो मुझे नहीं लगता कि 'सुंदर' समाधान हैं।

आप .each कॉल करने से पहले this के लिए एक संदर्भ स्टोर कर सकते हैं:

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

धन्यवाद निर्माता। अच्छा उत्तर। यह दिखाया गया है कि मैंने कुछ स्पष्ट नहीं छोड़ा है और मुझे स्वयं = @ विकल्प भी पसंद है। मैंने उसके बारे में सोचा होता। अभी भी इसका इस्तेमाल हो रहा है, लेकिन इसे पसंद है। –

+0

एक अलग नोट (शैली के) पर, आप $ ('foo') के बजाय वाक्यविन्यास ($ '.foo') के बारे में क्या सोचते हैं? टॉपफंकी पहली शैली को धक्का देने की कोशिश कर रहा था लेकिन मैं निराश हूं ... –

+0

व्यक्तिगत रूप से मुझे $ ('foo') पढ़ने में आसान लगता है। – mak

16

जबकि mak सही है, वह विफल रहता है बाहर बात करने के लिए कि कॉफी लिपि में आप शायद ही कभी jQuery के each विधि है, जो के रूप में आप पर ध्यान की जरूरत है, घूंसे अपने आपकी अनुमति के बिना चेहरे में निष्पादन संदर्भ।

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

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

कॉफी स्क्रिप्ट के पाशन सुविधाओं किसी भी वास्तविक कस्टम पुस्तकालय कोड के बिना each की अवधारणा का समर्थन है। और वे एक नया दायरा या संदर्भ भी उत्पन्न नहीं करते हैं जिसका अर्थ है कि आपको किसी भी तरह का वसा तीर की आवश्यकता नहीं है।

+0

अच्छी चीजें निचोड़! तुम बिल्कुल सही हो मैंने मक्का के जवाब को स्वीकार किए गए एक के रूप में छोड़ दिया है लेकिन आपका रास्ता बहुत साफ है - और जाने का रास्ता। मैं कुछ पुराने जेएस के रूपांतरण के साथ कॉफ़ीस्क्रिप्ट में लॉन्च हुआ था, इसलिए मैं इस समस्या को दबा दूंगा लेकिन अब मैं बेहतर जानता हूं। धन्यवाद। –

3

विभिन्न समाधान की जांच के बाद। यहां कुछ मेरे साथ सबसे पूर्ण नमूना के रूप में दिखाई देता है और क्लिक करें:

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)) 
संबंधित मुद्दे