簡體   English   中英

Rails - 從JavaScript調用CoffeeScript

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM