Функции в controller.js.coffee - PullRequest
4 голосов
/ 21 июня 2011

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

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

CoffeeScript ( assets / 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);

Ответы [ 2 ]

6 голосов
/ 21 июня 2011

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

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

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

window.validate_signup_form = validate_signup_form

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

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

3 голосов
/ 21 июня 2011

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

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

@validate_signup_form = ->
  alert "Hi"
  false

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

...