Rails - вызов CoffeeScript из JavaScript

20

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

Произнесите функцию в .js.coffee следующее:

myName = -> "Bob"

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

var theName = myName();

но это, похоже, не работает. Любые идеи?

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

  • 2
    Вы должны действительно принять ответ Фламбино. Это великолепно!
Теги:
coffeescript

1 ответ

55

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

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

window.myName = -> "Bob"

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

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

window.myNamespace = {};

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

window.myNamespace.myName = -> "Bob"

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

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

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

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

Изменить: Сделано myNamespace нижний-верблюд, поскольку в основном это переменная; не конструктор/класс

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

  • 0
    Потрясающие. Большое спасибо за отличный ответ. С нетерпением жду возможности попробовать это сегодня вечером.
  • 2
    Фантастический фантастический ответ
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню