2014-06-20 42 views
6

任何知道Rails资产管道的人都知道,默认行为是将包含在清单中的所有JavaScript文件都卷入一个大的,笨拙的,不幸的球。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(); 
} 

,而我显然有望跟随我的老板的方向,我对我在未来的应用程序中如何处理这个问题存在争议。我认为我的方法比表达方式更具表现力和灵活性,但我可能会错过一些关键缺陷。

您是如何看待这两种做法,无论是由他们自己还是彼此之间的关系,为什么?什么可能是解决同样问题的一些更好的方法?

回答

4

它是偏好的所有问题:

  1. 要小心,存在于DOM无论控制器/行动的所有元素。就像将JavaScript事件应用于通过整个应用程序呈现的导航元素一样。

  2. 基于控制器/动作做更有针对性的JavaScript逻辑。就像将单击事件添加到仅显示在此控制器和此操作中的特定按钮一样。

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

一种不同的方法,更加强调你的线条,将添加CONTROLLER_NAME和ACTION_NAME如类对身体标记 <body class="<%= controller_name %> <%= action_name %>">

那么你的文档随时检查里面一类的存在: $("body").hasClass("mycontroller");

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

+1

另一种选择是使用数据属性而不是类。我认为将数据控制器和数据操作添加到body标签而不是类会更简单。 – elevine

+0

另外一个不错的选择@elevine。我通常在控制器目标css声明的body标签上也有这些类,所以在我的情况下它会杀死两只鸟。 –

相关问题