2012-08-26 91 views
0

今天我正在將一些javascript代碼遷移到coffeescript中,並陷入了一件非常愚蠢的事情,但即使我不知道如何使它工作。無法修改JQuery監聽器中的Coffeescript全局變量

我想更新時單擊事件被觸發的全局變量的值,看看下面的代碼,看看我的猜測

之一下面的代碼

@activeObject = null 

# Some other code 

$ -> 
    $('#header').click -> 
    if !headerSelected 
     showMenu '#header-menu', event 
    else 
     @activeObject = "#header" 
     showMenu '#menu-style-header', event 

不幸的是,即使盡管點擊事件被觸發,變量沒有得到更新。

我想出了一個工作。我創建了一個函數來設置變量的值,並且調用它而不是賦值,並且這次它工作。

我只是想知道爲什麼我不能以其他方式做到這一點。對我而言,這是一個簡單的操作,爲此定義一個新函數似乎很愚蠢。

回答

2

您的問題是@(AKA this)單擊處理程序內是不一樣的,因爲它是外面所以這:

@activeObject = null 

這:

@activeObject = "#header" 

是指兩個不同的activeObject s。你應該能夠綁定一切與=>得到正確的this

$ => 
    $('#header').click => 
    #... 

或更好的(恕我直言),只是指window.activeObject直接在這兩個地方,以便它是有目共睹的,你指的是全局變量:

window.activeObject = null 
$ -> 
    $('#header').click -> 
    if !headerSelected 
     showMenu '#header-menu', event 
    else 
     window.activeObject = "#header" 
     showMenu '#menu-style-header', event 

或者,你可以停止的青睞,或許,數據屬性的完全使用全局變量:

$ -> 
    $('#header').data 'activeObject', null 
    $('#header').click -> 
    if !headerSelected 
     showMenu '#header-menu', event 
    else 
     $(@).data 'activeObject', '#header' 
     showMenu '#menu-style-header', event 
2

我認爲這個混淆是關於@的使用,它基本上只是這個的一個捷徑。 如果您編譯代碼,看看CoffeeScript的編譯器它產生的混亂變得清晰

this.activeObject = null; 

$(function() { 
    return $('#header').click(function() { 
    if (!headerSelected) { 
     return showMenu('#header-menu', event); 
    } else { 
     this.activeObject = "#header"; 
     return showMenu('#menu-style-header', event); 
    } 
    }); 
}); 

如果是的activeObject全球您參考對子級它

window.activeObject = NULL

window.activeObject = 「的#header」;

在這段代碼中的兩次出現中,都可能會誘使用戶在第二次出現時不使用窗口,但會導致新的局部變量被實現定義。

一般用的CoffeeScript啓動時,它的有用嘗試小snipets像這樣 http://coffeescript.org/Try Now標籤