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

Var*_*rac 6 javascript jquery ruby-on-rails

任何了解Rails资产管道的人都知道,清单中包含的所有JavaScript文件的默认行为都会被归入一个大的,笨拙的,不幸的球.

ALL THE JAVASCRIPT -> application.js
Run Code Online (Sandbox Code Playgroud)

这意味着如果你有一个JavaScript文件foo.js,它不仅会激活控制器foo到达的页面,还会激活每个其他页面.

这很容易解决,但我想知道最好的方法是什么.

我最初让application.html.erb使用JavaScript标记将当前控制器和操作传递给我的应用程序中的JavaScript.

<%= javascript_tag do %>
  window.givenController = "<%= controller_name %>";
  window.givenAction = "<%= action_name %>";
<% end %>
Run Code Online (Sandbox Code Playgroud)

在我的js文件中,我将使用这种if语句在控制器命名文件上包含特定于页面的代码,以确保它们仅在这些页面上运行.

if(givenController == "foo" && givenAction == "bar"){
  doStuff();
}
Run Code Online (Sandbox Code Playgroud)

我的老板认为这会创建不必要的变量,而是建议我使用if语句指向页面上的特定JQ元素:

if($("#some-element-in-foo").length > 0){
  doStuff();
}
Run Code Online (Sandbox Code Playgroud)

虽然我显然希望遵循我老板的指示,但我对如何在未来的应用程序中解决这个问题感到矛盾.我认为我的方法比建议的更具表现力和灵活性,但我可能会遗漏一些关键缺陷.

您如何看待这两种做法,无论是自己还是彼此,以及为什么?有什么可能是解决同样问题的更好方法?

Bil*_*tts 4

这完全取决于偏好:

  1. 处理 dom 中存在的所有元素,无论控制器/操作如何。就像将 javascript 事件应用于整个应用程序中存在的导航元素一样。

  2. 基于controller/action做更有针对性的javascript逻辑。就像向特定按钮添加单击事件一样,该按钮仅显示在该控制器和该操作中。

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

另一种不同的方法,更多的是你的方法,是将controller_name和action_name添加为body标签上的类 <body class="<%= controller_name %> <%= action_name %>">

然后在文档中检查是否存在类: $("body").hasClass("mycontroller");

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