Rails中共享的JS(Coffee)

时间:2013-12-13 08:02:45

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

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

假设我有 shared.js.coffee

sharedFunction = ->
  'Hello '

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

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

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

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

4 个答案:

答案 0 :(得分:6)

我是这样做的:

  • 确保您在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

现在,您可以通过以这种方式引用该功能,轻松访问其他coffeescript文件中的MyNamespace.mySharedFunc()

<强> P.S。

这个stackoverflow问题很好地解释了关于导出的神秘事情:How do I define global variables in CoffeeScript?

答案 1 :(得分:4)

application.js中,首先加载共享:

//= require shared
//rest of code

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

@sharedFunction = ->
  'Hello '

注意一个不好的做法也是有这样的全局变量,至少试着将它们保存在命名空间中。

答案 2 :(得分:0)

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

简单地替换

sharedFunction + name

sharedFunction() + name

已经完成了。

答案 3 :(得分:-1)

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