Nějaké obecné řešení práce s Javascriptem

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
Ani
Člen | 226
+
0
-

Ahoj,

zajímalo by mě jak řešíte javascritp (ruzné drobné funkce, obarvení textu, moseover, skrývání bloku). Píšete to do nějakého {block #js}. Nebo vše do externího souboru a inicializace přes document.ready nebo nějakou inicializační funkcí?

A co komponenty. Předáváte jim nějakou služby, kde se registrují a JS vypíšete na konec souboru?

Editoval Ani (8. 1. 2012 16:20)

Werkov
Člen | 17
+
0
-

Já jsem skončil (a začal) u bloků, které přes dědičnost rozšiřuji. Uvažoval jsem i o WebLoaderu, ale byl problém s dynamickým přidáváním JS z komponent, kvůli lazy vytváření. On by to zase nakonec takový problém nebyl, kdyby se jednalo jenom o JS a jeho načtení by se dalo vložit až na konec stránky, ale chtěl jsem to použít i pro CSS. (Další řešení je otouchovat všechny dotyčné komponenty předem, ale tak můžeš zbytečně vytvořit nepotřebnou komponentu a je s tím práce navíc.)

Různé pokusyřešení pomocí šablonových maker už najdeš ve fóru.

IMO by řešením mohlo být zavedení „životního cyklu“ i komponenty, některé její úkony je zkrátka nutno provést ještě předtím, než je ve stránce kreslena.

Aurielle
Člen | 1281
+
0
-

Mě se osvědčil Webloader s mírnou modifikací (abych mohl uvést výchozí soubory v šabloně, ale přitom šlo pořád přidávat přes $loader->addFiles()). „Životní cyklus“ komponenty řeší tuším LookoutControl, a mám pocit že je součástí Kdyby.

Ani
Člen | 226
+
0
-

Řekl bych že LookoutControl tohle neřeší, když se ti komponenta vykresluje inicializuje, při volání přes makro control je už pozdě kreslit něco do hlavičky.

Dá se to částečně řešit vlastním filtrem, který vyzobe ze šablony všechny controly a předčasně je inicializuje, zavolá v nich nějakou metodu která to zapojí, ale není to zrovna ideální řešení…

srigi
Nette Blogger | 558
+
0
-

Ja to momentalne riesim prasacky – includnem do hlavicky jQuery aj jQUI a v sablonach Viewov/komponentov pisem surovo

<script>
$(function(){

  // code here

});
</script>

Od toho ta dom.ready funkcia je – pockat na zostavenie DOM. Zatial je to prekvapivo funkcne, ale systemovost a spravovatelnost kodu sa mi nepaci.

Radsej by som JS presunul dole pred koncovu znacku </body> a nejako v sablone iba managoval include custom CSS/JS suboru pre dany View a komponentu. Je ale napikacu, ze z tych komponent nejde prebublat/extendnut blok, potom by to bolo uplne „maňifik“.

22
Člen | 1478
+
0
-

srigi napsal(a):
Je ale napikacu, ze z tych komponent nejde prebublat/extendnut blok, potom by to bolo uplne „maňifik“.

+1 – taky bych uvítal

petr.pavel
Člen | 535
+
0
-

Já to řeším několika js soubory, které includuji vždy, abych využil cache prohlížeče. Kód v nich je napsaný tak, aby nespadl, když zrovna stránka tenhle js nepotřebuje.

Jestli těch samostatných částí máte fakt hodně, vyzkoušejte novou podporu Nette pro .combined.js a .combined.css, abyste ušetřili čas na jednotlivé požadavky na server.

Jasně, stahuje se kód, který třeba většinou potřeba není. Zatím u mě ale vždy převážila výhoda použití cache.

Werkov
Člen | 17
+
0
-

petr.pavel napsal(a):

Já to řeším několika js soubory, které includuji vždy, abych využil cache prohlížeče. Kód v nich je napsaný tak, aby nespadl, když zrovna stránka tenhle js nepotřebuje.

Jistě pro cacheování je výhodnější (ač se později nacahuje i samostatný soubor JS/CSS komponent), ale neřeší to ten problém, že musíš pamatovat na všechny komponenty, které máš v aplikaci použité a explicitně je uvádět do toho (globálního JS)/(skupiny JS).

Nox
Člen | 378
+
0
-

Řešil bych to podobně jako Srigi, akorát bych to nedal přímo do jQuery.ready ale do nějakého registru který si pak zpracuji, nejspíš taky v tom jQuery.ready někde dole, bude nad tím asi o píď lepší kontrola

Na druhé straně to spoléhá na existenci toho kontejneru nebo nějaké konvence … tamto spoléhá na jQuery, ale to je jaksi rozšířenější. Dokonalé řešení mě zatím nenapadá

newPOPE
Člen | 648
+
0
-

Na tieto veci uz su riesenia nie? Load kniznic az ked su potrebne (netusim ako sa to vola)…

V sucastnosti som v stave kde sa vyhybam tomu co popisuje srigi (pred tym som to tak robil = nulova znovupouzitelnost) a riesim to nasledovne:

  • subor s definiciami xyz.js kde pisem nieco ako
<script>
var foo = {
	init: function() {...}
}
</script>

a potom uz len podla class alebo priamo v sablone zavesim na dany prvok

  • dalsia cesta je u mna priame rozsirovanie jQuery
<script>
jQuery.fn.foo = function(options) {...}
</script>

nejake setup veci su potom napr priamo v HTML tagu, nieco ako Nette Forms a validacne pravidla.

No ktovie kde budem za 2 tyzdne ;-)

EDIT: este ma napadlo, videl som riesenie ‚ala‘ google

<script>
	register.load('mojCoolJavascriptPreKomponentu.js');
</script>

ktory zrejme funguje na document.write (.append(..)) alebo nieco podobne

Editoval newPOPE (9. 1. 2012 14:35)

Ani
Člen | 226
+
0
-

Díky za reakce snažím se tu vymyslet nějaké praktické řešení, které by sesunulo všechen JS nakonec souboru, pokuď možno odstranilo duplicity, fungovalo to v komponentách a dalo se to psát přímo v šablonách) myslím že se mi to i částečně daří, až bude tak ho zveřejním.

Jen by mě ještě zajímalo jak řešíte třeba formulářové prvky, který mají JS? Tam to nejde napsat do šablony, když ji nemají, injectovat do nich nějaký loader také moc nejde. Probublat do presenteru je docela problém, když je ten prvek v xy kontejnerech. Máte ty prvky, tak že si registrujé svůj JS třeba výpisem v getControl()?

newPOPE Podobně snad funguje head.js https://forum.nette.org/…i-z-controlu

Editoval Ani (10. 1. 2012 2:31)

Filip Procházka
Moderator | 4668
+
0
-

Koukněte na Assetic v Kdyby ;)