Rails:为特定视图放置onload的位置

时间:2014-01-30 17:07:47

标签: javascript ruby-on-rails

我有一个视图,它有一些动态的分层选择(也就是说,第一个影响第二个选项中可用的选项)。刷新保留第一个选定的选项,但从第二个选择中删除选项。我通过初始化第二个选择的onload来处理这个问题。目前我在[控制器名称] .js.coffee中有window.onload,但是onload与我项目中的每个页面一起运行。显然,这两个选项不在每一页上。如何将其添加到需要它的页面?

2 个答案:

答案 0 :(得分:2)

为此,我在布局中设置了控制器名称的主体ID和动作名称的类(application.html。*)

<body id="<%= controller_name %> class="<%= action_name %>">
  <%= yield %>
</body>

然后在您的controller.js文件中,检查所需的控制器和/或操作;

$(document).ready(function() {
  if ($("#controller").length) {
    // Your specific controller code here
  }
})

PJAX用户注意:正文ID永远不会更新,你必须入侵pjax中间件 https://github.com/foohey/rack-pjax/commit/38caff53eec6a366aad3a2600d255529ebedfcc5#diff-2ae22cdf8106300731c4c37a3363ea48

答案 1 :(得分:0)

我在badfoo的建议之上构建了一个解决方案,它使用类来保持命名空间的清洁。

我在根布局(application.html。*)的body标签中添加了“controller”和“action”属性。

然后,在application.js.coffee中,我创建了一个获取这些属性的onload函数,检查一个类是否与控制器同名。 (因此,如果控制器是“客户端”,它将在js中查找“clients”类。)如果控制器类具有onload方法,则首先调用它。查找特定于操作的onload的过程如下:它检查与操作同名的客户端的子类。如果它存在且具有名为“onload”的方法,则调用此方法。如果该操作的子类不存在,它将在控制器类中检查名为“#{action} _onload”的方法并调用它。

window.onload = () ->
  capitalize = (str) ->
    str.charAt(0).toUpperCase() + str.slice(1)

  controller = capitalize(document.body.getAttribute('controller'))
  action = capitalize(document.body.getAttribute('action'))

  controller_class = eval "#{controller}"
  if controller_class?
    action_class = eval "#{controller}.prototype.#{action}"
    action_onload_func = eval "#{controller}.#{action}_onload"
    controller_onload_func = eval "#{controller}.onload"
    if action_class? and action_class.onload?
      onload_func = action_class.onload
    else if action_onload_func?
      onload_func = action_onload_func

  if controller_onload_func?
    controller_onload_func()
  if onload_func?
    onload_func()

重要的是要注意这些类必须通过在它们前面添加@符号来实现全局化。