我知道我来参加这个聚会有点晚了,但是我想提出一个我最近一直在使用的解决方案。但是,我首先要提一下...
Rails 3.1 / 3.2的方式(不,先生。我不喜欢它。)
请参阅:http : //guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
为了完整起见,我将以下内容包括在内,因为这不是可行的解决方案……尽管我不太在意。
“ Rails Way”是一个面向控制器的解决方案,而不是按此问题的原始作者要求的面向视图的解决方案。有特定于控制器的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。
我使用一个名为的自定义数据属性,而不是将JS锁定到特定的元素ID或用标记类乱扔HTML data-jstags
。
<input name="search" data-jstag="auto-suggest hint" />
在每个页面上,我都使用-在此处插入首选的JS库方法-在DOM完成加载后运行代码。该引导代码执行以下操作:
- 遍历标有DOM的所有元素
data-jstag
- 对于每个元素,在空间上分割属性值,创建一个标签字符串数组。
- 对于每个标签字符串,在哈希中执行该标签的查找。
- 如果找到匹配的键,请运行与其关联的功能,并将元素作为参数传递。
假设我在application.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函数,则必须施加一些创造力。添加数据参数属性,提出某种参数语法,甚至使用混合方法。
即使我有一些似乎特定于控制器的复杂工作流程,我也只会在我的lib文件夹中为其创建一个文件,将其打包到application.js中,并用“ new-thing-wizard”之类的标签对其进行标记。当我的引导程序点击该标签时,我的漂亮向导就会实例化并运行。它在需要时针对该控制器的视图运行,但未与该控制器耦合。实际上,如果我对向导进行了正确的编码,则也许可以在视图中提供所有配置数据,因此以后可以将向导重新用于需要它的任何其他控制器。
无论如何,这是我一段时间以来一直在实现页面特定的JS的方式,它对于简单的网站设计和更复杂/更丰富的应用程序都非常有用。希望我在这里介绍的两个解决方案之一(我的方式或Rails方式)对以后遇到此问题的任何人都有所帮助。