rails 3 javascript fine coffeescript referenceerror(class)未定义

时间:2012-11-14 20:12:28

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

RubyRogues播客上有人曾说过“学习CoffeeScript,因为CoffeeScript编写的javascript比你写得好。”抱歉,不记得是谁说的......

所以,我采用了一个非常简单的WORKING javascript函数:

togglingii.js

function pdtogglejs(id) {   $('div .partybackground').removeClass("hidden");  }

这一行正在调用:

<a href="#" class="dctoggle" onclick="pdtogglejs('partybackground')">Read More...</a>

然后我把它转换成了这个咖啡因: 的 toggling.js.coffee

pdtogglecs(id) ->
   jQuery('div .partybackground').removeClass("hidden")

并更改了html以引用pdtoggle * c * s而不是pdtoggle * j * s。

我可以在我的application.js文件中看到它们很好:

(function() {

  pdtogglecs(id)(function() {
    return jQuery('div .partybackground').removeClass("hidden");
  });

}).call(this);
function pdtogglejs(id) {   $('div .partybackground').removeClass("hidden");  }
;
(function() {



}).call(this);

但是,只有纯JavaScript才有用。 coffeescript始终返回未捕获的ReferenceError:未定义pdtogglecs。

基于其他stackoverflow问题,它必须是某种命名空间错误。可能是因为pdtogglecs本身就是一个函数内部的方式?但是,我尝试使用以下命令定义coffeescript函数:window.pdtogglecs,this.pdtogglecs,root.pdtogglecs和coffescript总是因为该错误而失败。

我错过了什么?

谢谢!

1 个答案:

答案 0 :(得分:11)

你有两个问题,一个是CoffeeScript语法混淆,另一个是你知道的命名空间问题。

我们首先要整理你的语法混乱。这样:

f(x) -> ...

的解释如下:

f(x)(-> ...)

所以当得到这个:

pdtogglecs(id) ->
   jQuery('div .partybackground').removeClass("hidden")

CoffeeScript认为您尝试将pdtogglecs作为函数调用id作为参数。然后它认为pdtogglecs(id)返回一个函数,并且您希望以-> jQuery(...)函数作为参数调用该函数。所以最终有点像这样:

callback = -> jQuery(...)
returned_function = pdtogglecs(id)
returned_function(callback)

这与你原来的JavaScript完全不同。你想创建一个名为pdtogglecs的函数,它以id为参数,然后运行你的jQuery东西:

pdtogglecs = (id) ->
    # -----^ this is sort of important
    jQuery('div .partybackground').removeClass("hidden")

通过查看生成的JavaScript,您可以看到正在发生的事情。

命名空间问题很简单,您可以根据您找到的其他问题找出答案。但是,为了完整起见,我会在这里照顾它。

CoffeeScript将每个.coffee文件包装在一个自执行函数中,以避免污染全局命名空间:

(function() {
    // JavaScript version of your CoffeeScript goes here...
})();

该包装器将所有内容限定为.coffee文件。如果你想污染全局命名空间,那么你必须这样说:

window.pdtogglecs = (id) -> ...

你也可以说:

@pdtogglecs = (id) -> ...

但我更喜欢直接引用window的明确性,这也可以避免在解析代码时担心@(AKA this)。