2011-12-07 34 views
1
(-> 
    jQuery -> 
    globalThis = @ 
    $('#emailTypes').change -> 
     globalThis.toggleEmailOptions() 

    toggleEmailOptions = -> 
    $('.emailTypeOptions').fadeOut 'fast', -> 
     for emailType in $('#emailTypes').val() 
     $("##{emailType}Options").fadeIn() 


).call this 

這是我的.coffee文件。但是,toggleEmailOptions函數不在jQuery ready的範圍內。我怎樣才能在範圍內?如何在瀏覽器中正確使用CoffeeScript範圍函數?

+0

因爲toggleEmailOptions無論如何都是本地變量,您可以將其移動到jQuery.Ready回調中。如果您希望在全局範圍內提供toggleEmailOptions,則可以使用=>代替 - >將其保留在函數中,並聲明@toggleEmailOptions代替toggleEmailOptions – Guillaume86

回答

1

我覺得你並不需要換,因爲CoffeeScript的已經做了,這裏就是我會重寫代碼:

jQuery -> 
    toggleEmailOptions = -> 
    $('.emailTypeOptions').fadeOut 'fast', -> 
     for emailType in $('#emailTypes').val() 
     $("##{emailType}Options").fadeIn() 

    $('#emailTypes').change -> 
    toggleEmailOptions() 
+0

這是好的,但這意味着我總是必須定義函數,然後才使用它們。我寧願不這樣做,因爲我想以特定的方式組織我的代碼。 – Shamoon

+0

實際上你不必先聲明它,它只是更容易閱讀imho,在http://js2coffee.org/上覆制粘貼,你會發現toggleEmailOptions變量在所有情況下在回調開始時聲明; ) – Guillaume86

2

http://jashkenas.github.com/coffee-script/

約CoffeeScript中通常的告誡: - 你的內嵌腳本將 封閉包裝內運行,所以如果你想揭露全球 變量或函數,將它們連接到window對象。

或者如果您使用node.js綁定到exports

對於你的榜樣,就變成:

window.toggleEmailOptions = -> 
+0

'$('#emailTypes')。change - > () '似乎不起作用=( – Shamoon

+0

最後嘗試沒有parens,你綁定了調用該函數的結果值,而不是函數本身 –

+0

如果我想做文件類型檢查,寬範圍?我不希望它被綁定到窗口..只是在這個特定的文件「全球」? – Shamoon

0

有這裏有幾個問題。一個是你似乎認爲@/this是來自jQuery回調的全局對象(window)。但很容易看出它不是:

jQuery -> console.log @ is window # false 

請記住,回調函數可以在庫所需的任何上下文中調用。在這種情況下,@document。而document.toggleEmailOptions不存在。

此外,如果你想toggleEmailOptions成爲一個全球性的,你需要將它連接到window(或@/this,因爲@ is window在文件的最外面的範圍)。這是因爲當您只寫toggleEmailOptions = ...時,CoffeeScript會使用var聲明將其範圍在文件中。通過查看編譯後的JS很容易看出:var始終位於其範圍的頂部。幸運的是,文件範圍無論如何都是你想要的。

所以基本上:不要反套!你想要的是:

jQuery -> 
    $('#emailTypes').change -> 
    toggleEmailOptions() 

並保持原樣。

相關問題