2013-02-13 54 views
1

我正在寫一個簡單的CoffeeScript類,但我運行到一個上下文的問題與此代碼:document.addEventListener「這個」背景下

class DragDrop 
constructor: (@selector, @bodyDragEnterClass = "drag-over") -> 
    @attachEventHandlers() 

attachEventHandlers:() -> 
    document.write(@bodyDragEnterClass) # this line tells me, that @bodyDragEnterClass is "drag-over" 
    document.addEventListener("dragenter", @onDragEnter, false) 

onDragEnter:() -> 
    document.write(@bodyDragEnterClass) # this line tells me, that @bodyDragEnterClass is undefined 
    jQuery("body").addClass(@bodyDragEnterClass) 

window.DragDrop = DragDrop 

當attachEventHandlers方法被調用時,@bodyDragEnterClass是按預期設置爲「拖拽」。但是,當觸發dragenter事件並調用onDragEnter方法時,@ bodyDragEnterClass爲「未定義」。

我創建了一個的jsfiddle證明上下文問題就在這裏:http://jsfiddle.net/SVvrM/

我怎樣才能解決這個問題?

回答

2

CoffeeScript中有「fat arrow」的經典案例。

您需要訪問在不同上下文中執行的回調內的DragDrop this值。使用FAT箭頭會的this當前值綁定到onDragEnter功能:

# "fat arrow" function binding 
onDragEnter:() => 
    document.write(@bodyDragEnterClass) # this line tells me, that @bodyDragEnterClass is undefined 
    jQuery("body").addClass(@bodyDragEnterClass) 
+1

@馬丁這是你周圍的CS場景中獲得的方式,但你應該明白它做什麼引擎蓋下。將胖箭頭代碼粘貼到在線CS代碼中,並查看它是如何設置「self = this」的 – Trevor 2013-02-14 02:32:40