Javascript Rails中的共享JS(咖啡)
如果我想在app/assets/JavaScript下的不同文件之间共享一些JavaScript函数,那么组织目录结构的最佳方式是什么 假设我已经分享了.js.coffee 现在,我如何在其他地方使用它?比如这里,在welcome.js.coffee里 如何使shared.js.cofee始终首先加载Javascript Rails中的共享JS(咖啡),javascript,ruby-on-rails,coffeescript,ruby-on-rails-4,Javascript,Ruby On Rails,Coffeescript,Ruby On Rails 4,如果我想在app/assets/JavaScript下的不同文件之间共享一些JavaScript函数,那么组织目录结构的最佳方式是什么 假设我已经分享了.js.coffee 现在,我如何在其他地方使用它?比如这里,在welcome.js.coffee里 如何使shared.js.cofee始终首先加载 我试着把它放在application.js的开头,但它没有改变任何事情。似乎共享文件加载太长,欢迎尝试开始执行,并注意到未定义sharedFunction。在application.js中,首先加
我试着把它放在application.js的开头,但它没有改变任何事情。似乎共享文件加载太长,欢迎尝试开始执行,并注意到未定义sharedFunction。在
application.js
中,首先加载共享文件:
//= require shared
//rest of code
在shared中,如果有必要,可以全局访问变量:
@sharedFunction = ->
'Hello '
请注意,使用这样的全局变量也是一种不好的做法,至少尝试将它们保留在名称空间中。最好只包含一个JS文件。如果您的资产管道知道如何将它们粘贴在一起,那么您可以在不同的资产之间进行拆分,但将不同的JavaScript发送到不同的页面则不如这样。发送一个更大的文件似乎违反直觉,尤其是对于每个页面,但缓存会改变这一点:JS文件只应加载一次。这也自动意味着您可以从任何页面访问所有功能。基本上,以前加载的功能可以在以后使用。但在这种情况下,函数不工作的原因很简单:您忘记执行它 简单地替换
sharedFunction + name
与
就这样完成了。我是这样做的:
- 确保您需要application.js中的文件,尤其是
require\u tree
- 导出函数(在我的例子中是一个类,因此它是命名空间的)
//= require ./shared
//= require_tree .
shared.js.coffee
class MyNamespace
@mySharedFunc: () ->
doSomething()
root = exports ? this
root.MyNamespace = MyNamespace
现在,通过以下方式引用函数,您可以在其他coffeescript文件中轻松访问该函数MyNamespace.mySharedFunc()
p.S.
关于导出的错误在这个stackoverflow问题中得到了很好的解释:是全局变量标签造成的!因此,在我看来,每个js.coffee文件都是独立的。将sharedFunction放入一个常规的.js文件也可以。是的,这是coffeescript的基础,每个文件都封装在一个函数中。你必须清楚地告诉我什么应该是全局可访问的我可以从这个包装器函数中使用sharedFunction而不使它成为全局变量吗?使用//require可以做到这一点,但是在全局名称空间中使用tooolset是可以的对不起,这是我在示例中的错误,但不是真正的问题。无论如何,谢谢你注意到:)最后两行到底是做什么的?我刚刚研究了Coffee名称空间,并看到了以下定义名称空间窗口的方法。这是同一件事吗?当我在P.S.中键入时,请阅读以下链接:
sharedFunction() + name
//= require ./shared
//= require_tree .
class MyNamespace
@mySharedFunc: () ->
doSomething()
root = exports ? this
root.MyNamespace = MyNamespace