【问题标题】:Shared JS (Coffee) in RailsRails 中的共享 JS(咖啡)
【发布时间】:2013-12-31 22:34:42
【问题描述】:

如果我想在 app/assets/javascript 下的不同文件之间共享一些 JavaScript 函数,那么组织目录结构的最佳方法是什么?

假设我有 shared.js.coffee

sharedFunction = ->
  'Hello '

现在,我如何在其他地方使用它?就像这里一样,在 welcome.js.coffee

welcome = (name) ->
  sharedFunction() + name

我怎样才能让shared.js.cofee 总是先加载

我试图把它放在 application.js 的最开始,但它并没有改变任何东西。似乎 shared 文件加载时间过长,welcome 设法开始执行并注意到 sharedFunction 未定义。

【问题讨论】:

    标签: javascript ruby-on-rails coffeescript ruby-on-rails-4


    【解决方案1】:

    application.js,先加载共享:

    //= require shared
    //rest of code
    

    如果有必要,在共享中,让您的变量可以全局访问:

    @sharedFunction = ->
      'Hello '
    

    请注意,使用此类全局变量也是一种不好的做法,至少尝试将它们保留在命名空间中。

    【讨论】:

    • 那个全局变量标签成功了!所以在我看来,每个 js.coffee 文件都与其他文件分开。将 sharedFunction 放入常规的 .js 文件中也可以。我很困惑。
    • 是的,它是coffeescript的基础,每个文件都包装在一个函数中。您必须明确说明应该全局访问的内容
    • 我可以在这个包装函数之外使用 sharedFunction 而不使其成为全局变量吗?
    • 使用 //require 可以解决问题,但是在全局命名空间中有一个工具集是可以的
    【解决方案2】:

    最好只包含一个 JS 文件。如果您的资产管道知道如何将它们粘贴在一起,您可以将其拆分为不同的资产,但将不同的 JavaScript 发送到不同的页面就逊色了。发送更大的文件似乎违反直觉,尤其是对于每个页面,但缓存会改变这一点:您的 JS 文件应该只加载一次。这也自动意味着您可以从任何页面访问所有功能。

    【讨论】:

      【解决方案3】:

      基本上之前加载的函数可以稍后使用。但在这种情况下,您的函数不起作用的原因很简单:您忘记执行它。

      简单替换

      sharedFunction + name
      

      sharedFunction() + name
      

      它已经完成了。

      【讨论】:

      • 对不起,这是我在示例中的错误,但不是真正的问题。无论如何,谢谢你注意到了:)
      【解决方案4】:

      我是这样做的:

      • 确保您首先需要 application.js 中的文件,尤其是在 require_tree 之前
      • 导出函数(在我的例子中是一个类,所以它是命名空间的)

      示例:(假设我们在同一级别有 application.js 和 shared.js.coffee)

      application.js

      //= require ./shared
      //= require_tree .
      

      shared.js.coffee

      class MyNamespace
        @mySharedFunc: () ->
          doSomething()
      
      root             = exports ? this
      root.MyNamespace = MyNamespace
      

      您现在可以通过MyNamespace.mySharedFunc()MyNamespace.mySharedFunc()这种方式在您的其他咖啡脚本文件中轻松访问该函数

      附言

      这个 stackoverflow 问题很好地解释了出口的神秘之处:How do I define global variables in CoffeeScript?

      【讨论】:

      • 最后两行到底是做什么的?我刚刚在研究 Coffee 命名空间,并看到了以下定义命名空间 window.MyNamespace = {} 的方式。这里也一样吗?
      • 当我输入 P.S. 时,请阅读此链接:stackoverflow.com/questions/4214731/…
      猜你喜欢
      • 1970-01-01
      • 2011-11-08
      • 2013-06-19
      • 2012-07-10
      • 2013-02-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多