Rails - вызов CoffeeScript из JavaScript - PullRequest
       17

Rails - вызов CoffeeScript из JavaScript

22 голосов
/ 13 февраля 2012

Я использую Rails 3.1 с CoffeeScript и столкнулся с проблемой. Как вызвать функцию из файла .js.erb, который находится в файле .js.coffee?

Скажите, что функция в .js.coffee следующая:

myName = -> "Bob"

Я думаю, я мог бы просто вызвать его как любую обычную функцию js, такую ​​как:

var theName = myName();

но это не похоже на работу. Есть идеи?

или можно использовать coffeescript в моем файле .js.erb, чтобы все было одинаково?

1 Ответ

54 голосов
/ 13 февраля 2012

Причина, по которой вы не можете вызывать функцию CoffeeScript напрямую, заключается в том, что CoffeeScript оборачивается в немедленно вызываемую функцию при компиляции.Это сделано для того, чтобы ваш код не загрязнял глобальное пространство имен.

Как правило, это хорошая идея ™, но, конечно, вы можете обойти ее, когда вам нужно.Если вы хотите, чтобы функция или другая переменная были доступны везде (то есть глобальная область), вы можете просто сказать

window.myName = -> "Bob"

Таким образом, функция добавляется непосредственно в глобальную область,и вы можете вызывать его из любого места как window.myName() (или просто как myName(), если только функция не скрывается за локальной).

Однако, чтобы поддерживать глобальное пространство имен как можно более чистым, лучше всегоопределите пространство имен для себя (как это делает jQuery, поместив все в объект $).Например, в вашем первом файле CoffeeScript или JavaScript (то есть в первом загружаемом файле) вы можете сделать что-то вроде этого

window.myNamespace = {};

Затем, когда вы захотите, чтобы что-то было доступно в другом месте, вы можете добавить егов это пространство имен:

window.myNamespace.myName = -> "Bob"

И затем вы можете вызывать его из любого места, используя window.myNamespace.myName() или просто myNamespace.myName().

В качестве альтернативы, вы можете использовать "назначение, если не определено" или "null" CoffeeScriptоператор в верхней части всех ваших файлов:

window.myNamespace ?= {} # create myNamespace if it doesn't already exist

В зависимости от того, какой файл будет оценен первым, будет создан отсутствующий объект window.myNamespace.Последующий код просто увидит, что он уже существует, и пропустит назначение.Дело в том, что он всегда будет доступен, независимо от порядка оценки.

Редактировать: Сделано myNamespace нижний регистр верблюдов, так как он в основном переменный;не конструктор / класс

Приложение: Вы можете избежать оболочки функций, используя переключатель командной строки -b/--bare, но, как уже упоминалось, оболочка - это хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...