(->
jQuery ->
globalThis = @
$('#emailTypes').change ->
globalThis.toggleEmailOptions()
toggleEmailOptions = ->
$('.emailTypeOptions').fadeOut 'fast', ->
for emailType in $('#emailTypes').val()
$("##{emailType}Options").fadeIn()
).call this
这是我的.coffee
文件。但是,toggleEmailOptions
函数不在jQuery ready
的范围内。我怎样才能在范围内制作它?
答案 0 :(得分:2)
来自http://jashkenas.github.com/coffee-script/
关于CoffeeScript的常见警告适用 - 您的内联脚本会 在闭包装中运行,所以如果你想暴露全局 变量或函数,将它们附加到窗口对象。
如果您正在使用node.js,请绑定到exports
。
对于您的示例,它变为:
window.toggleEmailOptions = ->
答案 1 :(得分:1)
我认为你不需要换行,因为coffeescript已经这样做了,这就是我将如何重写你的代码:
jQuery ->
toggleEmailOptions = ->
$('.emailTypeOptions').fadeOut 'fast', ->
for emailType in $('#emailTypes').val()
$("##{emailType}Options").fadeIn()
$('#emailTypes').change ->
toggleEmailOptions()
答案 2 :(得分:0)
这里有几个问题。一个是你似乎假设@
/ this
是来自jQuery回调的全局对象(window
)。但很容易看出它不是:
jQuery -> console.log @ is window # false
请记住,可以在库所需的任何上下文中调用回调。在这种情况下,@
为document
。并且document.toggleEmailOptions
不存在。
此外,如果您希望toggleEmailOptions
成为全球性的,则需要将其附加到window
(或@
/ this
,因为@ is window
文件的最外层范围)。那是因为当您只编写toggleEmailOptions = ...
时,CoffeeScript使用var
声明将其范围限定在文件中。通过查看已编译的JS很容易看到这一点:var
始终位于其范围的顶部。幸运的是,文件范围无论如何都是你想要的。
所以基本上:不要过度思考它!你想要的是:
jQuery ->
$('#emailTypes').change ->
toggleEmailOptions()
并保持原样。