controller.js.coffee中的函数

Emi*_*äck 4 ruby-on-rails coffeescript ruby-on-rails-3.1

我在使用CoffeeScript创建函数时遇到了一些麻烦,我想我错过了一些东西.对于我的用户控制器,我想为注册表单创建客户端验证.我想我已经错过了这一切如何运作的基本原则.

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

CoffeeScript(assets/users.js.coffee):

validate_signup_form = () ->
    alert "Hi"
    return false
Run Code Online (Sandbox Code Playgroud)

预期产量:

var validate_signup_form;
validate_signup_form = function() {
  alert("Hi");
  return false;
};
validate_signup_form();
Run Code Online (Sandbox Code Playgroud)

实际输出:

(function() {
  var validate_signup_form;
  validate_signup_form = function() {
    alert("Hi");
    return false;
  };
}).call(this);
Run Code Online (Sandbox Code Playgroud)

pol*_*lau 6

实际上一切都按照预期的方式工作.正如您可以在这里阅读的那样,Coffeescript将您的代码包装在一个匿名函数中,以防止污染全局命名空间.如果你只是看一下这些例子,你可能会错过这个,但文档明确指出:

虽然为了清楚起见在本文档中进行了抑制,但所有CoffeeScript输出都包含在一个匿名函数中:(function(){...})(); 这个安全包装器与var关键字的自动生成相结合,使得非常难以意外地污染全局命名空间.

为了访问在此仿真范围内声明的对象,变量或方法,您需要使其在全局范围内显式可用,例如:

window.validate_signup_form = validate_signup_form
Run Code Online (Sandbox Code Playgroud)

如果您提到我肯定会使用事件来触发该方法.

顺便说一句:你的方法声明中不需要空括号foo =->就可以了.

  • "coffeescript --bare"将编译代码而不使用匿名包装器. (2认同)