gpt4 book ai didi

javascript - 使用 Rails Assets 管道时有选择地运行 javascript 的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-29 22:28:04 25 4
gpt4 key购买 nike

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com