Rails页面特定的JavaScript:最佳实践是什么?

7

如果您了解Rails的资产管道,就会知道默认行为是将清单中包含的所有JavaScript文件合并成一个大而笨重、不幸的文件。

ALL THE JAVASCRIPT -> application.js

这意味着如果你有一个JavaScript文件foo.js,它不仅会对被控制器foo访问的页面进行激活,而且还会对所有其他页面进行激活。
这很容易解决,但我想知道最好的方法是什么。
我最初使用JavaScript标签使application.html.erb向我的应用程序传递当前的控制器和操作。
<%= 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();
}

虽然我显然需要遵循我的老板的指示,但我对如何处理未来的应用程序感到矛盾。我认为我的方法比建议的方法更具表现力和灵活性,但我可能会忽略一些关键缺陷。

您对这两种做法有什么看法,无论是单独还是相互之间,并为什么?解决同一问题的更好方法可能是什么?

2个回答

4

这完全是个人偏好:

  1. 处理dom中出现的所有元素,而不管控制器/操作。例如,将javascript事件应用于整个应用程序中存在的导航元素。

  2. 根据控制器/操作执行更有针对性的javascript逻辑。例如,向仅在此控制器和此操作中显示的特定按钮添加单击事件。

您很可能需要在应用程序中解决这两种情况。

另一种方法,更符合您的思路,是将controller_name和action_name作为类添加到body标签中:<body class="<%= controller_name %> <%= action_name %>">

然后在文档准备就绪时检查类的存在:$("body").hasClass("mycontroller");

这将消除您的老板对不必要变量的抱怨。


1
另一个选择是使用数据属性而不是类。我认为将data-controller和data-action添加到body标签中会更加简洁。 - Eric Levine
另外一个不错的选择是 @elevine。我通常也会在 body 标签上添加这些类,以便针对控制器的 CSS 声明,这样就一举两得了。 - Bill Watts

3

非常感谢。经过数小时的搜索,那篇文章正是我所需要的! - Thomas Taylor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接