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将水平回收视图放置在特定位置