任何了解 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 来看,为什么?有什么更好的方法可以解决同样的问题?
最佳答案
这都是偏好问题:
不管 Controller /操作如何,都要注意 dom 中存在的所有元素。就像将 javascript 事件应用于整个应用程序中存在的导航元素。
基于 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/