Rails 中的共享 JS(咖啡)
Posted
技术标签:
【中文标题】Rails 中的共享 JS(咖啡)【英文标题】:Shared JS (Coffee) in Rails 【发布时间】: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 未定义。
【问题讨论】:
【参考方案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()
这种方式在您的其他咖啡脚本文件中轻松访问该函数
附言
这个 *** 问题很好地解释了出口的神秘之处:How do I define global variables in CoffeeScript?
【讨论】:
最后两行到底是做什么的?我刚刚在研究 Coffee 命名空间,并看到了以下定义命名空间 window.MyNamespace = 的方式。这里也一样吗? 当我输入 P.S. 时,请阅读此链接:***.com/questions/4214731/…以上是关于Rails 中的共享 JS(咖啡)的主要内容,如果未能解决你的问题,请参考以下文章
为啥 rails 对咖啡脚本文件使用 .js.coffee 扩展名,因为它们无论如何都不能包含 JavaScript 代码?