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

Dav*_*ins 2 javascript jquery coffeescript ruby-on-rails-3

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

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

togglingii.js

function pdtogglejs(id) {   $('div .partybackground').removeClass("hidden");  }
Run Code Online (Sandbox Code Playgroud)

这条线被称为:

<a href="#" class="dctoggle" onclick="pdtogglejs('partybackground')">Read More...</a>
Run Code Online (Sandbox Code Playgroud)

然后,我将它改成这样的CoffeeScript: toggling.js.coffee

pdtogglecs(id) ->
   jQuery('div .partybackground').removeClass("hidden")
Run Code Online (Sandbox Code Playgroud)

并更改了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);
Run Code Online (Sandbox Code Playgroud)

但是,只有纯JavaScript才有效.coffeescript始终返回Uncaught ReferenceError:未定义pdtogglecs.

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

我错过了什么?

谢谢!!

mu *_*ort 11

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

我们首先要解决你的语法混乱.这个:

f(x) -> ...
Run Code Online (Sandbox Code Playgroud)

解释如下:

f(x)(-> ...)
Run Code Online (Sandbox Code Playgroud)

所以当给出这个:

pdtogglecs(id) ->
   jQuery('div .partybackground').removeClass("hidden")
Run Code Online (Sandbox Code Playgroud)

CoffeeScript认为你试图作为一个参数调用pdtogglecs函数id.然后它认为pdtogglecs(id)返回一个函数,你想用你的-> jQuery(...)函数作为参数调用该函数.所以最终有点像这样:

callback = -> jQuery(...)
returned_function = pdtogglecs(id)
returned_function(callback)
Run Code Online (Sandbox Code Playgroud)

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

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

您可以通过查看生成的JavaScript来查看正在发生的事情.

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

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

(function() {
    // JavaScript version of your CoffeeScript goes here...
})();
Run Code Online (Sandbox Code Playgroud)

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

window.pdtogglecs = (id) -> ...
Run Code Online (Sandbox Code Playgroud)

你也可以说:

@pdtogglecs = (id) -> ...
Run Code Online (Sandbox Code Playgroud)

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