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

Posted

技术标签:

【中文标题】Rails:为特定视图放置 onload 的位置【英文标题】:Rails: where to put onload for a specific view 【发布时间】:2014-02-23 03:14:04 【问题描述】:

我有一个具有一些动态分层选择的视图(即,第一个影响第二个中可用的选项)。刷新会保留第一个选择的选项,但会删除第二个选择的选项。我通过初始化第二个选择的 onload 来处理这个问题。目前我在 [controller name].js.coffee 中有那个 window.onload,但是这个 onload 在我的项目中的每个页面上都运行。显然,这两个选择并不是在每一页上。如何将它添加到需要它的页面?

【问题讨论】:

【参考方案1】:

为此,我在布局中设置了控制器名称的主体 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 用户注意:body id 永远不会更新,你必须破解 pjax 中间件 https://github.com/foohey/rack-pjax/commit/38caff53eec6a366aad3a2600d255529ebedfcc5#diff-2ae22cdf8106300731c4c37a3363ea48

【讨论】:

有什么方法可以将它与部分一起使用吗?这是一个很好的解决方案,但我在 application.html.* 中有 body 标记以消除冗余,因此我无法为其添加 id 或 class。 你应该在你的布局中设置body id (application.html.*) 我从没想过有一种通用的方法可以从视图中访问控制器和操作名称。谢谢。对于其他这样做的人:how to get controller/action names【参考方案2】:

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

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

然后,在 application.js.coffee 中,我创建了一个获取这些属性的 onload 函数,检查是否存在与控制器同名的类。 (所以如果控制器是“Clients”,它会在 js 中寻找“clients”类。)如果控制器类有 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()

请务必注意,这些类必须通过在它们前面加上 @ 符号来使其成为全局类。

【讨论】:

以上是关于Rails:为特定视图放置 onload 的位置的主要内容,如果未能解决你的问题,请参考以下文章

使用ConstraintLayout将水平回收视图放置在特定位置

Rails:将逻辑移出视图

如何将 UIView 子视图放置在适当的位置

我应该在 Rails 应用程序的哪个位置放置将不同 JSON 字符串展平为类友好格式的功能?

如何将 UIImageView 放置在子视图的特定区域中

在哪里放置不是模型、视图、控制器或助手的 Rails 代码?