我意识到我来晚了一点,但我想提出一个我最近一直在使用的解决方案。不过,我首先要提...
Rails 3.1/3.2 方式(不,先生。我不喜欢它。)
请参阅: http: //guides.rubyonrails.org/asset_pipeline.html#how-to-use-the-asset-pipeline
为了完整起见,我在此答案中包含以下内容,并且因为它不是一个不可行的解决方案……尽管我不太关心它。
“Rails Way”是一个面向控制器的解决方案,而不是像这个问题的原作者所要求的那样面向视图。有以它们各自的控制器命名的特定于控制器的 JS 文件。所有这些文件都放置在默认情况下不包含在任何 application.js 要求指令中的文件夹树中。
为了包含特定于控制器的代码,将以下内容添加到视图中。
<%= 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
- 对于每个元素,在空间上拆分属性值,创建一个标签字符串数组。
- 对于每个标签字符串,在该标签的 Hash 中执行查找。
- 如果找到匹配的键,则运行与其关联的函数,将元素作为参数传递。
假设我在 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
andmy_hint_init
函数,将其转换为在用户键入时显示建议列表的输入,并在输入为空且未聚焦时提供某种输入提示。
除非某些元素带有 标记,否则data-jstag="auto-suggest"
自动建议代码永远不会触发。但是,它总是在那里,缩小并最终缓存在我的 application.js 中,以供我在页面上需要它的时候使用。
如果您需要将其他参数传递给标记的 JS 函数,则必须运用一些创造力。添加数据参数属性,提出某种参数语法,甚至使用混合方法。
即使我有一些看起来特定于控制器的复杂工作流程,我也会在我的 lib 文件夹中为其创建一个文件,将其打包到 application.js 中,并用类似“new-thing-wizard”之类的东西标记它。当我的引导程序点击那个标签时,我漂亮的、漂亮的向导将被实例化并运行。它在需要时为该控制器的视图运行,但不以其他方式耦合到控制器。事实上,如果我的向导编码正确,我可能能够在视图中提供所有配置数据,因此以后能够将我的向导重新用于需要它的任何其他控制器。
无论如何,这就是我一段时间以来一直在实现特定于页面的 JS 的方式,它对于简单的网站设计和更复杂/丰富的应用程序都非常有用。希望我在这里介绍的两种解决方案之一,我的方式或 Rails 方式,对将来遇到这个问题的任何人都有帮助。