2014-06-20 38 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標籤上也有這些類,所以在我的情況下它會殺死兩隻鳥。 –

相關問題