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

Rails page-specific JavaScript: What's the best practice?

本文关键字:最佳 什么 于页面 JavaScript Rails      更新时间:2023-09-26

了解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();
}

虽然我显然被期望遵循老板的指示,但我对在未来的应用程序中应该如何处理这一点感到矛盾。我认为我的方法比建议的更具表现力和灵活性,但我可能遗漏了一些关键的缺陷。

你如何看待这两种做法,它们各自的做法和相互之间的做法,为什么?有什么更好的方法来解决这个问题吗?

这都是个人喜好的问题:

  1. 处理dom中存在的所有元素,不管控制器/动作是什么。

  2. 基于控制器/动作做更有针对性的javascript逻辑。比如给一个特定的按钮添加一个点击事件,这个事件只出现在这个控制器和这个动作中。

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

另一种不同的方法,更适合您的行,将controller_name和action_name作为类添加到body标记上<body class="<%= controller_name %> <%= action_name %>">

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

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

在http://railsapps.github.io/rails-javascript-include-external.html#external上有一些关于如何实现这一点的信息。那篇文章的一个建议是使用Paloma宝石。