2011-05-28 65 views
4

所以我有兩個控制器,hotelsvideos。我希望hotels.js.coffee能夠訪問在videos.js.coffee中創建的函數,但我得到「未定義」錯誤。Coffescript如何從其他資產訪問函數?

我是CoffeeScript的新手,所以任何線索將不勝感激。

+0

沿着這些線出現了幾個最近的問題。請參閱http://stackoverflow.com/questions/6099342/how-can-i-use-option-bare-in-rails-3-1-for-coffeescript/6099872和http://stackoverflow.com/questions/6137733/how-do-you-limit-coffeescript-or-javascript-execution-to-a-particular-controlle – 2011-05-28 17:09:50

回答

3

在編譯期間,CoffeeScript將您的代碼封裝在一個匿名函數中並應用它。您必須以您的環境預期的方式導出公共界面。

(exports || window).publicMethod = (foo, bar) -> foo + bar 

然後,您需要在node.js中,並通過在瀏覽器中引用window對象使用require()

還有其他方法可以在瀏覽器中執行此操作。看看RequireJS

7

CoffeScript在匿名函數中運行,因此在同一文件中聲明的函數不會導出爲全局函數。

嘗試這樣的事情來聲明全局函數:

window.myFunction = -> 
    //some code 
+0

這個語法適用於我,以上兩種都沒有。 – 2011-11-04 05:06:53

0

事實上,你可以使用頂層窗口的變量或對象的出口通過CommonJS的提供。請注意,您也可以訪問完整的控制器,而不僅僅是功能。

請參閱http://jashkenas.github.com/coffee-script/中的章節'詞彙範圍界定和變量安全'和''文本/ coffeescript'腳本標記'。

13

CoffeeScript會將您的咖啡編譯爲JS,並將其封裝在一個自我執行的函數中,其窗口範圍爲(function {})。

所以在videos.js.coffee你可以寫這樣的:

@getVideo: (id) -> 

和getVideo功能將被綁定到窗口對象。

+0

當我在類似的情況下嘗試這個時,我得到一個javascript錯誤:丟失:屬性編號後 [打開此錯誤] this.hide_modal:function(modal_id){ 我的功能: '@hide_modal:(modal_id) - > animate_top = Number($('#'+ modal_id).height()+ 70) current_top = $('#'+ modal_id).css('top') $('#'+ modal_id) .animate top:' - '+ animate_top +'px' - > $(this).css({'top':current_top,'visibility':'hidden'}); $('。reveal-modal-bg')。fadeOut()' – 2011-11-04 05:03:43

+0

@DavidSavage可以修復格式化/ pastbin嗎? – Thurloat 2011-11-06 01:18:59

+0

對不起:http://pastebin.com/z9jFwfXp 我已經移動並使用相同的代碼,只是用window.hide_modal替換@hide_modal – 2011-11-08 01:17:50