【问题标题】:Running a CoffeeScript Class on document.ready在 document.ready 上运行 CoffeeScript 类
【发布时间】:2011-06-07 13:00:03
【问题描述】:

我有

class Main
   test:->
      alert "yay!"

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

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

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

还是在 document.ready 之后执行 coffeescript?

谢谢!

【问题讨论】:

标签: coffeescript


【解决方案1】:

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

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

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

基本上是这样说的:

jQuery(回调) 返回:jQuery 描述:绑定一个函数,当 DOM 完成加载时执行。

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

希望对你有帮助!

【讨论】:

    【解决方案2】:

    class Main

    改用class @Main

    obv Main.test();不工作

    没错。应该是new Main().test()Main::test()

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

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

    【讨论】:

    • 只是对这个问题的未来读者有一点帮助,如果您直接包含 .coffee 并使用 coffee.js 编译它们,则会发生竞争条件,并且它不起作用(如果您使用 CLI 编译,一切都很好)所以为了让它工作,我做了: $(function(){ setTimeout(function(){ new Main() },1000); });希望对您有所帮助。
    【解决方案3】:

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

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

    # 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);
    

    【讨论】:

      【解决方案4】:

      我之前也遇到过这个问题。首先,由于您正在定义一个类,因此您需要实例化它。然后你可以在实例上调用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
      

      【讨论】:

        猜你喜欢
        • 2013-08-05
        • 2015-04-07
        • 2013-07-31
        • 1970-01-01
        • 2011-12-10
        • 2013-07-16
        • 2014-08-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多