我知道我来这个派对有点晚了,但我想提出一个我最近一直在用的解决方案。然而,让我首先提一下……
The Rails 3.1/3.2 Way(不,先生,我不喜欢它。)
见:http://guides.rubyonrails.org/asset_pipeline.html how-to-use-the-asset-pipeline
为了完整起见,我在这个回答中包括以下内容,因为这不是一个不可行的解决方案……虽然我不太喜欢。
“Rails方式”是一个面向控制器的解决方案,而不是像这个问题的原始作者所要求的那样面向视图。有一些特定于控制器的JS文件,以它们各自的控制器命名。所有这些文件都被放置在一个文件夹树中,默认情况下,任何application.js require指令都不包含这个文件夹树。
为了包含特定于控制器的代码,将以下内容添加到视图中。
<%= javascript_include_tag params[:controller] %>
我讨厌这个解决方案,但它就在那里,而且很快。假设你可以将这些文件命名为“people-index.js”和“people-show.js”,然后使用“#{params[:controller]}-index”来获得面向视图的解决方案。同样是权宜之计,但我不喜欢。
我的数据属性方式
叫我疯狂,但我想我所有的JS编译和缩小到application.js当我部署。我不想在所有地方都包含这些零散的文件。
我把我所有的JS加载到一个紧凑的,即将被浏览器缓存的文件中。如果我的application.js的某一部分需要在页面上被触发,我会让HTML来告诉我,而不是Rails。
我使用了一个名为data-jstags的自定义数据属性,而不是将JS锁定到特定的元素id或用标记类丢弃HTML。
<input name="search" data-jstag="auto-suggest hint" />
在每个页面上,我使用-此处插入首选JS库方法-在DOM完成加载时运行代码。这段引导代码执行以下操作:
遍历DOM中标记有data-jstag的所有元素
对于每个元素,在空格上分割属性值,创建一个标记字符串数组。
对于每个标记字符串,在哈希中对该标记执行查找。
如果找到匹配的键,则运行与之关联的函数,将元素作为参数传递。
所以说,我有以下定义在我的应用程序。js某处:
function my_autosuggest_init(element) {
/* Add events to watch input and make suggestions... */
}
function my_hint_init(element) {
/* Add events to show a hint on change/blur when blank... */
/* Yes, I know HTML 5 can do this natively with attributes. */
}
var JSTags = {
'auto-suggest': my_autosuggest_init,
'hint': my_hint_init
};
引导事件将对搜索输入应用my_autosuggest_init和my_hint_init函数,在用户输入时将其转换为显示建议列表的输入,并在输入为空白和不集中时提供某种输入提示。
除非某些元素被标记为data-jstag="auto-suggest",否则自动建议代码永远不会触发。然而,它总是在那里,缩小并最终缓存在我的application.js中,以便我在页面上需要它。
如果你需要将额外的参数传递给你标记的JS函数,你将不得不应用一些创造性。要么添加数据参数属性,提出某种参数语法,甚至使用混合方法。
Even if I have some complicated workflow that seems controller-specific, I will just create a file for it in my lib folder, pack it into application.js, and tag it with something like 'new-thing-wizard'. When my bootstrap hits that tag, my nice, fancy wizard will be instantiated and run. It runs for that controller's view(s) when needed, but is not otherwise coupled to the controller. In fact, if I code my wizard right, I might be able to provide all configuration data in the views and therefore be able to re-use my wizard later for any other controller that needs it.
不管怎样,这就是我现在实现特定页面JS的方式,它对简单的站点设计和更复杂/丰富的应用程序都很有帮助。希望我在这里介绍的两种解决方案之一,我的方式或Rails的方式,对将来遇到这个问题的任何人都有帮助。