rails Assets 管道有它的问题,但连接我所有的 JS、缩小它并使用远期过期 header 提供它的好处是难以忽视的。
我的 Rails 应用程序中的许多 JS 都是特定于单个操作的。例如,我们有一个复杂的页面供员工输入客户订单。
在 rails 3.1 之前,我在一个独特的 JS 文件中有特定于操作的代码,该文件仅在需要时加载。现在我所有的 JS 一直都在服务。仅在需要时运行订单输入 JS 的最佳方式是什么?
目前我正在检查订单输入 DOM 元素,但这意味着 DOMready 上会运行很多不必要的函数。
这是来自订单输入代码的 coffeescript 片段,这种模式在大约 20 个文件中重复出现。有没有更好的办法?
$ ->
window.app.draft = new app.DraftOrder()
@module 'app', ->
class @DraftOrder
constructor: ->
@items = $('table.draft-items tr')
return if @items.size() == 0
@initEvents()
@move_first()
initEvents: ->
# foo
otherMethod: ->
# bar
最佳答案
我喜欢将特定于页面的 JS 包装在一个闭包中,并在我的应用程序模板中插入代码,以便我有选择地执行它。
因此,我的“事件” Controller 的页面特定 js 可能如下所示:
events = {
onload: function() {
// put any page-specific onload code here
},
someOtherRoutine: function() {
}
}
在我的应用程序模板 (application.html.erb) 中,我添加:
<%= javascript_tag do %>
window.controller_name = <%= params[:controller] %>;
window.action_name = <%= params[:action] %>;
<% end%>
然后,在 application.js 中(假设您使用 jQuery):
$(function() {
if(controller_name === 'events'){
events.onload();
}
else if(controller_name === 'anothercontroller'){
anothercontroller.onload();
}
// put any global onload functionality here...
});
这还有一个额外的好处,就是为所有特定于页面的 JS 提供一种穷人的命名空间。
可能有更惯用的 rails/javascript 方式来做到这一点;我主要不是 JS 程序员,但我正在学习相当喜欢这门语言......
关于javascript - 使用 Rails Assets 管道时有选择地运行 javascript 的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8393277/