2011-06-21 4 views
4

У меня возникли проблемы с созданием функций с помощью CoffeeScript, я, наверное, что-то пропустил. Для моего контроллера пользователей я хотел бы создать проверку на стороне клиента для формы регистрации. Я думаю, что я пропустил что-то принципиальное, как все это работает.Функции в controller.js.coffee

<%= form_for @user, :html => {:onsubmit => "return validate_signup_form();"} do |f| %> 

CoffeeScript (активы/users.js.coffee):

validate_signup_form =() -> 
    alert "Hi" 
    return false 

Ожидаемый результат:

var validate_signup_form; 
validate_signup_form = function() { 
    alert("Hi"); 
    return false; 
}; 
validate_signup_form(); 

Реальный выход:

(function() { 
    var validate_signup_form; 
    validate_signup_form = function() { 
    alert("Hi"); 
    return false; 
    }; 
}).call(this); 
+0

Лучшим подходом к этому является привязка событий к полям, но если у кого-то есть решение этой конкретной проблемы, я был бы рад услышать это, это может пригодиться в другой раз. –

+0

странный, онлайн-кофейник почти извлекает то, что вы ожидаете. См .: http://jashkenas.github.com/coffee-script/ – apneadiving

+0

Да, что-то меняется, когда Rails включает файл. Может быть особенностью. :) –

ответ

6

На самом деле everythi ng работает так же, как и предполагалось. Как вы можете прочитать here, Coffeescript обертывает ваш код анонимной функцией, чтобы предотвратить загрязнение глобального пространства имен. Если вы просто взглянуть на примеры, вы можете пропустить это, но документы явно состояние:

Хотя подавлено в этой документации для ясности, все CoffeeScript выход заворачивают в анонимной функции: (функция() {... })(); Эта защитная оболочка, объединенная с автоматической генерацией ключевого слова var, делает ее чрезвычайно сложно загрязнять глобальное пространство имен случайно.

Чтобы получить доступ к объекту, переменной или методу, объявленным в пределах этой искусственной области, вам необходимо сделать его явно доступным в пределах глобальной области видимости, например. например:

window.validate_signup_form = validate_signup_form 

В случае, о котором вы упоминаете, я определенно использовал бы события для запуска метода.

Btw: Нет необходимости в пустой скобке в объявлении вашего метода foo =-> работает отлично.

+0

Спасибо за разъяснение! На самом деле, я только просмотрел примеры. –

+0

Приятно это знать, спасибо – apneadiving

+2

«coffeescript --bare» скомпилирует код без анонимной обертки. –

3

Ответ полярбрау вполне правильный. Смотрите также:

Замыкание обертка отличный способ хранения файлов модульной (как должно быть), поэтому я настоятельно советую против избавиться от него. Следует отметить, что во внешней рамки ваших модулей, this/@ будет window, так что вы можете сделать свой код работать, как предполагалось, просто добавив один символ:

@validate_signup_form = -> 
    alert "Hi" 
    false 

Это до вас ли вы бы предпочитают использовать @ или window. для определения глобалов, но стиль @ имеет еще одно преимущество: если вы повторно используете свой код в приложении Node.js, то он все равно будет работать. Эти объекты будут прикреплены к exports вместо window.