20

我有

class Main
   test:->
      alert "yay!"

在咖啡脚本中,我想在我的 index.html 中运行它

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

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

还是咖啡脚本在 document.ready 之后执行?

谢谢!

4

4 回答 4

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 函数让它在适当的时间运行。

我希望这会有所帮助!

于 2011-11-16T06:49:53.853 回答
24

class Main

试试class @Main吧。

obv Main.test(); 不工作

对。应该是new Main().test()Main::test()

无论如何,coffeescript 在 document.ready 之后执行吗?

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

于 2011-01-12T01:08:21.370 回答
9

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

如果您希望任何变量、函数或类是全局的(以便其他文件可以访问它们),您需要通过将它们附加到thisor来显式地使它们成为全局的window

# 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);
于 2011-02-06T06:02:44.470 回答
0

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

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

但是,您可能已经注意到浏览器找不到您的Main课程。这是因为在编译 CoffeeScript 时,它会在您的类定义周围包装一个自执行函数,以防止Main被全局访问。如果你想让它全局可访问,你可以在它前面加上 window:

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

或在定义后分配它:

class Main
   test:->
      alert "yay!"

window.Main = Main
于 2012-10-01T16:23:01.433 回答