如果我想在 app / assets / javascript 下的不同文件之间共享一些JavaScript函数,那么组织目录结构的最佳方式是什么?
假设我有 shared.js.coffee
sharedFunction = ->
'Hello '
现在,我如何在其他地方使用它?就像这里一样,在 welcome.js.coffee
中welcome = (name) ->
sharedFunction() + name
如何让 shared.js.cofee 始终首先加载?
我试图把它放在 application.js 的最开头,但它没有改变任何东西。似乎共享文件加载时间过长, welcome 设法开始执行并注意到未定义sharedFunction。
答案 0 :(得分:6)
我是这样做的:
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文件应该只加载一次。这也意味着您可以从任何页面访问所有功能。