Rails中共享的JS(Coffee)

Mis*_*rev 3 javascript ruby-on-rails coffeescript ruby-on-rails-4

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

假设我有shared.js.coffee

sharedFunction = ->
  'Hello '
Run Code Online (Sandbox Code Playgroud)

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

welcome = (name) ->
  sharedFunction() + name
Run Code Online (Sandbox Code Playgroud)

如何使shared.js.cofee 始终首先加载

我试着把它放在application.js的最开头,但它没有改变任何东西.似乎共享文件加载时间太长,欢迎管理开始执行并注意到未定义sharedFunction.

apn*_*ing 6

application.js,首先负载共享:

//= require shared
//rest of code
Run Code Online (Sandbox Code Playgroud)

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

@sharedFunction = ->
  'Hello '
Run Code Online (Sandbox Code Playgroud)

请注意,拥有这样的全局变量是一种不好的做法,至少尝试将它们保留在名称空间中。


Fir*_*DoL 6

我是这样做的:

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

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

的application.js

//= require ./shared
//= require_tree .
Run Code Online (Sandbox Code Playgroud)

shared.js.coffee

class MyNamespace
  @mySharedFunc: () ->
    doSomething()

root             = exports ? this
root.MyNamespace = MyNamespace
Run Code Online (Sandbox Code Playgroud)

您现在可以通过以这种方式引用它来轻松访问其他coffeescript文件中的函数 MyNamespace.mySharedFunc()

PS

关于导出的神秘之处在这个stackoverflow问题中得到了很好的解释:如何在CoffeeScript中定义全局变量?