javascript - Rails 页面特定的 JavaScript : What's the best practice?

标签 javascript jquery ruby-on-rails

任何了解 Rails Assets 管道的人都知道默认行为是将 list 中包含的所有 JavaScript 文件卷成一个大的、笨拙的、不幸的球。

ALL THE JAVASCRIPT -> application.js

这意味着如果您有一个 JavaScript 文件 foo.js,它不仅会为 Controller foo 到达的页面激活,还会为所有其他页面激活。

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

我最初让 application.html.erb 使用 JavaScript 标记将当前 Controller 和操作传递给我应用中的 JavaScript。

<%= javascript_tag do %>
  window.givenController = "<%= controller_name %>";
  window.givenAction = "<%= action_name %>";
<% end %>

在我的 js 文件中,我会用这种 if 语句将命名为 Controller 的文件上的页面特定代码包围起来,以确保它们只在这些页面上运行。

if(givenController == "foo" && givenAction == "bar"){
  doStuff();
}

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

if($("#some-element-in-foo").length > 0){
  doStuff();
}

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

您如何看待这两种做法,无论是从它们本身还是从彼此的 Angular 来看,为什么?有什么更好的方法可以解决同样的问题?

最佳答案

这都是偏好问题:

  1. 不管 Controller /操作如何,都要注意 dom 中存在的所有元素。就像将 javascript 事件应用于整个应用程序中存在的导航元素。

  2. 基于 Controller /操作做更有针对性的 javascript 逻辑。就像将点击事件添加到仅显示在此 Controller 和此操作中的特定按钮。

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

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

然后在您的文档中准备好检查类的存在: $("body").hasClass("mycontroller");

这将消除您的老板对不必要变量的提示。

关于javascript - Rails 页面特定的 JavaScript : What's the best practice?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24328746/

相关文章:

php - Jquery添加未传递给php的输入数组字段

ruby-on-rails - Rails pdf-extract gem 有 sqlite 作为依赖项,但我使用 pg 因为 Heroku 需要它所以 bundle 安装失败

javascript - Angular 是否会干扰此点击事件绑定(bind)?

javascript - 我应该在 React/Redux 中将脚本放在哪里?

jquery - 使用 jQuery .trigger 调用返回值的自定义函数

ruby-on-rails - 来自 rails 的带有 Sinatra : what is the equivalent of a . js.erb 的 Ruby?

ruby-on-rails - Rspec 3.7.0 在规范套件中显示 Puma 日志

javascript - 返回的函数变成了 Promise,不能再被调用

php - 使用 ajax/jquery 模拟 html 表单 POST

javascript - 使用 JSON 将 API 生成的 PID 添加到 URL