Ошибка «Не удается найти переменную» в Rails 3.1 и Coffeescript - PullRequest
22 голосов
/ 22 мая 2011

В моем приложении есть представления, которые ссылаются на мой файл application.js, который содержит функции, которые я использую во всем приложении.

Я только что установил кандидат на выпуск Rails 3.1 после того, как использовал крайнюю версию 3.1. Пока я не установил RC, у меня не было никаких проблем, но теперь я получаю эту ошибку:

ReferenceError: Невозможно найти переменную: индикатор_тага

Indicator_tag - это функция, которую я определил в application.js. Единственное отличие, которое я заметил в файле javascript, заключается в том, что теперь все мои функции заключены в:

(function() { ... }).call(this);

Я так понимаю, это для переменной области видимости? Но может ли это помешать моим страницам использовать эти переменные? И прежде чем кто-нибудь спросит, я убедился, что пути JavaScript в моих тегах включения указаны правильно.

Ответы [ 2 ]

47 голосов
/ 22 мая 2011

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

Вверху каждого файла coffeescript добавьте строку вроде

window.Application ||= {}

Это обеспечит постоянное присутствие глобального приложения с именем.

Теперь для каждой функции, которую вам нужно будет вызвать из другого файла, определите их как

Application.indicator_tag = (el) ->
  ...

и вызывайте их, используя

Application.indicator_tag(params)
12 голосов
/ 06 сентября 2011

Решение Dogbert - отличный способ, если у вас очень сложный JS-сервер.Однако есть гораздо более простое решение, если у вас есть только несколько функций, с которыми вы работаете.Просто добавьте их непосредственно к объекту окна, например так:

window.indicator_tag = (el) ->
  ...

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

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