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 ).
归档时间: |
|
查看次数: |
2134 次 |
最近记录: |