【问题标题】:How to invoke coffeescript function from js.erb on Rails 3 and how to understand scope in Javascript如何在 Rails 3 上从 js.erb 调用 coffeescript 函数以及如何理解 Javascript 中的范围
【发布时间】:2013-11-09 21:56:18
【问题描述】:

carts.js.coffee

$(document).ready ->
    add_book: () ->
        alert "hihi!!"

我尝试调用 window.add_book();和 add_book();在

add_to_cart.js.erb

但两者都行不通。

add_book();
window.add_book();

并且在 Firebug 或 Webrick 控制台上没有显示错误

顺便说一句,我看不懂

vars或functions在里面是什么意思

(function() {})

或者当函数被 {{ }}

({
add_book: function() {
return alert("poc123!!");
}
});

有没有教程或关键词可以让我找到相关资源?

提前致谢

【问题讨论】:

标签: javascript ruby-on-rails ruby-on-rails-3 coffeescript erb


【解决方案1】:

原因是你不能在js erb或coffee erb中使用$(document).ready

当你通过 Ajax 传递这个 js erb 时,文档已经准备好很久了。如果您的 erb 中的函数在文档准备就绪状态下,它们将永远不会有机会被调用。

所以简单的解决方法是,删除准备好的文档,然后直接调用函数。

【讨论】:

    【解决方案2】:

    我不确定您在函数中使用add_book: 的期望是什么,但这肯定不是您想要的。这是为您的代码生成的 javascript:

    $(document).ready(function() {
      return {
        add_book: function() {
          return alert("hihi!!");
        }
      };
    });
    

    您正在返回一个包含该函数的对象,但没有人可以访问它,因为它没有被任何人引用。

    你想要的是一个变量,能够包含一个引用:

    $(document).ready ->
        window.add_book = () ->
            alert "hihi!!"
    

    现在,您可以在任何地方使用它(当然是在 domready 之后),直接调用add_book()

    如果您使用 chrome,this extension 可能会帮助您发现 coffeescript 问题:它是一个实时 shell,可让您查看计算的 js 并运行 coffeescript 代码。

    顺便说一句,我建议在您熟练使用 javascript 之前不要使用 coffeescript。

    【讨论】:

      猜你喜欢
      • 2011-07-08
      • 2020-09-22
      • 2016-05-27
      • 1970-01-01
      • 2014-02-16
      • 1970-01-01
      • 2012-03-04
      • 2023-03-15
      • 2012-10-20
      相关资源
      最近更新 更多