2014-06-20 20 views
6

Każdy, kto wie o potoku Railsowym, wie, że domyślne zachowanie dotyczy wszystkich plików JavaScript zawartych w manifeście, które można zrolować w jedną dużą, niezręczną, niefortunną piłkę.JavaScript specyficzny dla strony Railsów: jaka jest najlepsza praktyka?

ALL THE JAVASCRIPT -> application.js 

Oznacza to, że jeśli masz JavaScript foo.js plików, to będzie aktywować nie tylko dla stron zawartych przez foo kontrolera, ale także dla każdej innej strony.

Jest to bardzo łatwe w obsłudze, ale zastanawiam się, jaki jest najlepszy sposób na zrobienie tego.

Pierwotnie miałem application.html.erb przekazać bieżący kontroler i działanie do JavaScript w mojej aplikacji przy użyciu tagu JavaScript.

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

W moich plikach js, chciałbym następnie otoczyć konkretną stronę kodową na kontrolerów nazwanych plików z tego typu if aby upewnić się, że tylko prowadził na tych stronach.

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

Mój szef twierdzi, że to stwarza niepotrzebne zmienne i zasugerował, że zamiast używać if wskazując konkretnych elementów JQ na stronie:

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

Chociaż jestem oczywiście oczekiwać, aby śledzić mojego szefa wskazówek, jestem w konflikcie o tym, jak powinienem podejść do tego w przyszłych aplikacjach. Myślę, że moje podejście jest bardziej ekspresyjne i elastyczne niż sugerowane, ale może brakować pewnych wad krytycznych.

Co sądzisz o tych dwóch praktykach, zarówno samodzielnie, jak i wobec siebie nawzajem, i dlaczego? Jakie mogą być lepsze sposoby rozwiązania tego samego problemu?

Odpowiedz

4

To wszystko kwestia preferencji:

  1. zadbać o wszystkie elementy, które są obecne w DOM niezależnie od kontrolera/akcji. Podobnie jak stosowanie zdarzeń javascript do elementów nawigacyjnych, które są obecne w całej aplikacji.

  2. Wykonaj lepiej ukierunkowaną logikę javascript na podstawie kontrolera/działania. Podobnie jak dodanie zdarzenia kliknięcia do konkretnego przycisku, który pojawia się tylko w tym kontrolerze i tej czynności.

Najprawdopodobniej będziesz potrzebować rozwiązać dla obu przypadków w aplikacji.

Inne podejście, bardziej na liniach Ciebie, byłoby dodać controller_name i action_name jako klasy w znaczniku body <body class="<%= controller_name %> <%= action_name %>">

Następnie wewnątrz dokumentu gotowego sprawdzenia pod kątem obecności klasy: $("body").hasClass("mycontroller");

To wyeliminowałoby skargę szefa na niepotrzebne zmienne.

+1

Inną opcją jest użycie atrybutów danych zamiast klas. Myślę, że byłoby trochę czysto dodać kontroler danych i akcję danych do tagu ciała zamiast klas. – elevine

+0

Również inna dobra opcja @elevine. Zwykle mam również te klasy na tagach body dla deklaracji CSS kontrolowanych na celowniku, więc w moim przypadku zabijam dwa ptaki. –

Powiązane problemy