在document.ready上运行CoffeeScript类

时间:2011-01-12 00:16:05

标签: coffeescript

我有

class Main
   test:->
      alert "yay!"

在coffeescript中,我想在我的index.html

中运行它
<script>
    $(function(){
        //and obv Main.test(); doesn't work
    });
</script>

网站上有这样的说明,它表示无效。但我找不到如何使它工作。有任何想法吗?我需要找出什么是coffeescript封装包装。

或coffeescript是否在document.ready之后执行?

THX!

4 个答案:

答案 0 :(得分:26)

要在document.ready之后执行Coffeescript,你可以像这样使用jQuery:

$ ->
  # Put your function code here
  init()

正在做的是运行jQuery(function(){callback ...}),就像这个链接的第3部分一样: http://api.jquery.com/jQuery/

基本上这样说:

jQuery(callback)返回:jQuery 描述:绑定DOM完成加载时要执行的函数。

我在文档之外声明我的所有类等,然后调用init函数以使其在适当的时间运行。

我希望有所帮助!

答案 1 :(得分:24)

  

class Main

请尝试class @Main

  

obv Main.test();不起作用

右。应为new Main().test()Main::test()

  

coffeescript会在document.ready之后执行吗?

假设你是通过extras/coffee-script.js并使用jQuery执行它,是的。

答案 2 :(得分:9)

Coffeescript将您的代码包装在一个函数调用中,这样您就不会意外地覆盖全局变量。

如果您希望任何变量,函数或类是全局的(因此可以被其他文件访问),您需要通过将它们附加到thiswindow来明确地将它们全局化。 / p>

# Stays within the function scope, so you can't access it outside the file
myNotGlobalFunction -> return

# Attaches it to `this` aka `window`, so can be accessed globally
this.myGlobalFunction -> return

# A shortcut using @ which is an alias to `this.`
@myOtherGlobalFunction -> return

这编译为:

(function() {
  myNotGlobalFunction(function() {
    return;
  });
  this.myGlobalFunction(function() {
    return;
  });
  this.myOtherGlobalFunction(function() {
    return;
  });
}).call(this);

答案 3 :(得分:0)

我之前也遇到过这个问题。首先,由于您要定义一个类,因此需要实例化它。然后你可以在实例上调用test函数:

<script>
    $(function(){
        var an_instance_of_main = new Main();
        an_instance_of_main.test();
    });
</script>

但是,您可能已经注意到浏览器无法找到您的Main课程。这是因为编译CoffeeScript时,它会围绕您的类定义包装一个自执行函数,以防止Main被全局访问。如果要使其可全局访问,可以在其前面添加窗口:

class window.Main
   test:->
      alert "yay!"

或在定义后指定它:

class Main
   test:->
      alert "yay!"

window.Main = Main