Witam, mam pytanie o słuszność takiego rozwiązania. Sytuacja wygląda tak, korzystam z jQuery, ustawiam jakieś handlery dla jakiś wydarzeń na określone elementy strony. Standard, ktoś klika komórkę tabeli pojawia się coś tam etc. Jednak nie każda podstrona posiada taki element lub chce, żeby działało to tylko dla tego jednego elementu. Stwierdziłem zatem, że nie mogę takich rzeczy wpisywać w jeden plik.js. Szukałem tematów i informacji odnośnie javascript dla specyficznych widoków, czytałem o assetach. Zmieniłem plik assets/javascipt/application.js
//= require jquery
//= require jquery_ujs
//= require_directory .
aby nie zaciągał mi całej zawartości assets. Liczyłem na możliwosć napisania jakiegoś dynamicznego require ale chyba nic z tego. Jedyne co wymyśliłem to w pliku głównym application.html.erb dopisać
<%= javascript_include_tag "#{params[:controller]}/#{params[:action]}" %>
polecenie będzie mi dołączać odpowiedni plik js, można jeszcze dopisać jakiś warunek sprawdzający czy jest taki plik, żeby w logach nie sypały się błędy. No ale jest to wbrew idei assets’ów, jeżeli dobrze zrozumiałem to polega to na przyśpieszeniu ładowania strony poprzez zmniejszenie rozmiaru pliku (usunięcie komentarzy i pustych lini) i ilości requestów przeglądarki(złączenie wszystkich js w jeden plik). Proszę o pomoc czy rozwiązanie to jest do przyjęcia, aplikacja która piszę jest małym projektem tworzonym w celu nauki railsów i czas nie jest tu kluczowy, jednak dobrze było by robić wszystko optymalnie. Z góry dziękuje za pomoc
Ale będzie to działać tylko wtedy gdy zakładamy, że na każdej podstronie mam elementy różniące się atrybutami np. id, name, class. Czyli np. strona new.html.erb ma jakiś <input type="text" name="product[name]" id="product_name" ..>
no ale strona edit.html.erb również posiada taki element bo korzysta z jednego partiala _form.html.erb. A powiedzmy, że tylko przy nowym produkcie ma się coś dziać a dla edycji niekoniecznie. Oczywiście mogę do if’a dołożyć jakiś warunek typu czy form do którego należy ten input ma taką a taką akcję itp. Ale wydaje mi się, że można to zrobić lepiej
Czekaj, Marr, kolega Listopad jest na razie na etapie odkrywania czym się różni formularz nowego od istniejącego rekordu. Podsuwanie mu na tym etapie złego rozwiązania (tego akurat problemu) to kiepski pomysł.
Tzn. w ogóle więcej js-u niż application.js to ma sens tylko w sensownie podzielonych pionowo aplikacjach (landing, panel klienta, panel admina – dla każdej z tych sekcji JEDEN osobny javascript). Jeśli dla zachowania działania kodu musisz go rozbić na konkretne akcje albo kontrolery, to znaczy że go kiepsko napisałeś i prędzej czy później zacznie być syf (kiedy w kontrolerze X sobie niewinnie wyrenderujemy mały widżet z formularzem z Y…).
Tomash co masz na myśli mówiąc o różnicy między formularzem nowego rekordu a istniejącego. Mógłbym powiedzieć, że partial formularza _form.html.erb renderowany jest z różnych ‘miejsc’, odpowiednie akcje kontrolera podsuwają inny obiekt (new - nowy, czysty obiekt modelu, zapisany dopiero po submit, edit - model utworzony na podstawie rekordu z bazy, update po submit). Akcja formularza jest akcja z kontrolera. Nie wiem co więcej można powiedzieć. Z Twojej wypowiedzi wywnioskowałem, że czegoś bardzo ważnego nie doczytałem o tym
Wracając do tematu, mówisz, że należy lepsze selektory w jQuery tworzyć tak aby wszystko umieszczone w application.js spełniało swoje zadanie. A w przypadku wielu podstron w aplikacji, każde załadowanie strony i przejście przez całą funkcję [code=javascript]$(document).ready(function(){
if ( jeżeli_mamy_inputa_name_na_formatce_edytowania_rekordu_product )
daj jakiegoś handlera na klikniecie
if ( jeżeli_mamy_inputa_name_na_formatce_nowego_rekordu_product )
daj handlera na puszczenie przycisku
if ( element na jakiejś konkretnej stronie )
daj handlera
itd.
});[/code]
przypuśćmy, że będzie to strona bardzo interaktywna i będzie wiele if’ów i wiele selektorów jQuery nie wydłuży to czasu oczekiwania na uzyskanie pełnej funkcjonalności strony?
Czy to nie jest tak, że używając większości metod jquery wywoływanych na elementach, biblioteka sprawdzanie odwala za nas? Wydawało mi się, że takie ify warto robić tylko w przypadku, kiedy spodziewamy się, że dostaniemy wartość undefined.
Jeśli koniecznie chcesz używać na danej stronie tylko tych metod, które są dla danej strony, to możesz dać jakąś klasę body i na przykład robić coś takiego:
if( $("body.some-controller-some-action").size > 0 ) {
// kod dla danej strony
}
Sprawdziłeś te klasy i id w wygenerowanym htmlu?
Bardzo nie lubię kiedy na wskazanie źródła wiedzy i tym samym rozwiązania problemu pytający reaguje słowotokiem zamiast zajrzeć gdzie został skierowany.
Oraz tak jak @sarniak napisał, grupowanie ftw. W Javascripcie też można robić obiekty i metody