我有一个视图,它有一些动态的分层选择(也就是说,第一个影响第二个选项中可用的选项)。刷新保留第一个选定的选项,但从第二个选择中删除选项。我通过初始化第二个选择的onload来处理这个问题。目前我在[控制器名称] .js.coffee中有window.onload,但是onload与我项目中的每个页面一起运行。显然,这两个选项不在每一页上。如何将其添加到需要它的页面?
答案 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()
重要的是要注意这些类必须通过在它们前面添加@符号来实现全局化。