[英]Rails - Calling CoffeeScript from JavaScript
我正在使用帶有CoffeeScript的Rails 3.1並遇到了麻煩。 如何從位於.js.coffee文件中的.js.erb文件中調用函數?
假設.js.coffee中的函數如下:
myName = -> "Bob"
我想我可以像任何常規的js函數一樣調用它,例如:
var theName = myName();
但這似乎不起作用。 有任何想法嗎?
或者是否可以在我的.js.erb文件中使用coffeescript來使一切都一樣?
你無法直接調用CoffeeScript函數的原因是CoffeeScript在編譯時被包裝在一個立即調用的函數中。 這樣做是為了防止代碼污染全局命名空間。
這通常是一個好主意™,但當然你可以在需要時繞過它。 如果您希望可以在任何地方訪問函數或其他變量(即全局范圍),您可以簡單地說
window.myName = -> "Bob"
這樣,函數直接添加到全局范圍,您可以從任何地方調用它作為window.myName()
(或簡單地作為myName()
除非函數被本地陰影所覆蓋)。
但是,為了使全局命名空間盡可能保持干凈,最好為自己定義命名空間(就像jQuery一樣,將所有內容放入$
對象中)。 例如,在您的第一個CoffeeScript或JavaScript文件(即要加載的第一個文件)中,您可以執行類似的操作
window.myNamespace = {};
然后,只要您想在其他地方使用某些內容,就可以將其添加到該命名空間:
window.myNamespace.myName = -> "Bob"
然后你可以使用window.myNamespace.myName()
或者只是myNamespace.myName()
從任何地方調用它。
或者,您可以在所有文件的頂部使用CoffeeScript的“assign if undefined or null”運算符:
window.myNamespace ?= {} # create myNamespace if it doesn't already exist
首先評估哪個文件將創建缺少的window.myNamespace
對象。 后續代碼只會看到它已經存在並跳過賦值。 重點是,無論評估順序如何,它始終可用。
編輯:使myNamespace
低 - camelcase,因為它基本上是一個變量; 不是構造函數/類
附錄:您可以通過使用-b/--bare
命令行開關來避免函數包裝器,但如上所述,包裝器是一件好事。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.