任何了解Rails资产管道的人都知道清单中包含的所有JavaScript文件的默认行为都会被卷入一个大的,笨拙的,不幸的球。
ALL THE JAVASCRIPT -> application.js
这意味着如果你有一个JavaScript文件foo.js,它不仅会激活控制器foo到达的页面,还会激活每个其他页面。
这很容易解决,但我想知道最好的方法是什么。
我最初让application.html.erb使用JavaScript标记将当前控制器和操作传递给我的应用中的JavaScript。
<%= javascript_tag do %>
window.givenController = "<%= controller_name %>";
window.givenAction = "<%= action_name %>";
<% end %>
在我的js文件中,我会使用这种if语句在控制器命名文件上包含特定于页面的代码,以确保它们只在这些页面上运行。
if(givenController == "foo" && givenAction == "bar"){
doStuff();
}
我的老板认为这会创建不必要的变量,而是建议我使用if语句指向页面上的特定JQ元素:
if($("#some-element-in-foo").length > 0){
doStuff();
}
虽然我显然希望遵循我老板的指示,但我对如何在未来的应用程序中解决这个问题感到矛盾。我认为我的方法比建议的更具表现力和灵活性,但我可能会遗漏一些关键缺陷。
您如何看待这两种做法,无论是自己还是彼此,以及为什么?什么可能是解决同样问题的更好方法?
答案 0 :(得分:4)
这完全是一个偏好问题:
无论控制器/操作如何,都要注意dom中存在的所有元素。就像将javascript事件应用于整个应用程序中存在的导航元素一样。
根据控制器/操作做更多有针对性的javascript逻辑。就像将click事件添加到仅显示在此控制器和此操作中的特定按钮一样。
您很可能需要在应用程序中解决这两种情况。
另一种方法,更多的是你的方法,是在body标签上添加controller_name和action_name作为类
<body class="<%= controller_name %> <%= action_name %>">
然后在文档中准备检查是否存在类:
$("body").hasClass("mycontroller");
这将消除老板对不必要变量的抱怨。
答案 1 :(得分:2)
有关如何在http://railsapps.github.io/rails-javascript-include-external.html#external处理此问题的一些信息。该文的一个建议是使用Paloma gem。