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

标签 javascript ruby-on-rails coffeescript asset-pipeline

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/

相关文章:

javascript - 高效查找以前的帖子 (keystoneJS)

ruby-on-rails - ruby - File.open 和重命名后权限被拒绝

coffeescript - 如何使用 CoffeeScript 存在运算符检查未定义的某些对象属性?

javascript - Express 应用程序具有两个版本的客户端

javascript - $.each 不适用于 jquery 选择器?

javascript - 加载这个图片怎么办?

ruby-on-rails - 如何在我的种子数据中创建相同的记录 X 次?

ruby-on-rails - ruby on rails id 没有保存

html - 在 coffeescript 中通过 ID 获取元素

javascript - 独立于事件运行的 Coffeescript 函数