【问题标题】:How do I call a JavaScript function from an erb template?如何从 erb 模板调用 JavaScript 函数?
【发布时间】:2013-09-03 15:11:14
【问题描述】:

如果您定义一个 JavaScript 函数,然后从 erb 模板调用它,则该函数不会被调用。为什么?单击此链接应该会显示警报,但不会。

= link_to "Add Sprout", new_sprout_path, remote: true

控制器:

def new
  @sprout = Sprout.new
  respond_to { |format| format.js }
end

然后在模板中我调用一个函数:

# sprouts/new.js.erb
doSomething();

函数在我的js文件中定义:

# javascripts/sprouts.js.coffee
doSomething = ->
  alert "yum ghum I am a new sprout."

JavaScript 回来了。我可以在控制台中看到它。但我没有看到任何警报。为什么这不起作用?

我正在使用 Rails 4。

【问题讨论】:

    标签: jquery ruby-on-rails ujs


    【解决方案1】:
    @doSomething = -> alert "yum ghum I am a new sprout."
    

    window.doSomething = -> alert "yum ghum I am a new sprout." # I prefer this approach, as it's more explicit.
    

    【讨论】:

    • 谢谢。你能帮我理解为什么我的代码不使用@ 不起作用吗?
    • @user2615384 在您的示例中,JS 函数被包装在一个匿名函数中——(function(){ var doSomething = function(){...} }).call(this);——所以当你的模板尝试执行它时它不存在。在 var 前面加上 @window.doSomething 相同,因此使函数“全局”或更准确地说是窗口对象的属性。
    • 你打败了我,凯尔。无论如何,这是我的回应:在 CoffeeScript 中,变量和函数的范围仅限于创建它们的文件,以避免变量冲突。 (如果您查看编译后的 JavaScript,您会发现您的代码包含在 IIFE 中。)@this 的简写,如果 this 恰好是 window,那么该变量将可用在全球范围内。 (this 也可以是由对象、函数等创建的上下文。)使用window 可确保变量在全局命名空间中可用。
    猜你喜欢
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 1970-01-01
    相关资源
    最近更新 更多