Automatické nastavení name componenty
- redhead
- Člen | 1313
Je nějaký důvod, proč by metoda addComponent nemohla setovat proměnnou name právě vytvořené komponenty?
Jde mi o to, že pokud chci nějakou komponentu, tak zadávám její jméno. To jméno je potom použito jako klíč pro přístup přes pole. Ptám jesli existuje reálná situace kdy se bude ‚klíč‘ jmenovat jinak než proměnná ‚name‘ komponenty (podle mě to není ani možné, protože by se pak nemohla najít) nebo situace kdy musí být name NULL. Takže by metoda mohla setovat name, pokud ho programátor už neuvedl, stejně jako se ‚setuje‘ rodič komponenty.
private function createComponentMyForm() {
return new Form; //addComponent se postará o připojení a i pojmenování
}
Problém mám např. u Live Validace, kde pokud neuvedu název formuláře, nebude fungovat, protože jeho name je null. Samozřejmě je to věc implementace LV, ale zase nevidím důvod, proč bych někdy potřeboval name = NULL.
Editoval redhead (18. 2. 2010 23:22)
- Panda
- Člen | 569
Hm, jenže ono se to jméno nastavuje automaticky. Problém je někde jinde…
Konstruktor třídy LiveClientScript
přebírá jako jeden
parametr instanci formuláře. To je v pořádku. Co ale v pořádku není, je
to, co s ním pak dělá – uloží si do dočasné proměnné název
formuláře a předgeneruje si názvy metod. Jenže co se stane, když třídu
LiveClientScript
vytvoříme v továrničce chvilku po vytvoření
instance nepojmenovaného formuláře? Do LiveClientScript
u se
uloží prázdná jména a tam už zůstanou navždy. Po proběhnutí
továrničky se sice komponenta pojmenuje a připojí k presenteru, ale
LiveClientScript
to nezohlední. Aby fungovalo to, co Ty
popisuješ, tak by musela nějaká část Nette zasáhnout do běhu funkce
samotné továrničky a komponentu pojmenovat ihned po jejím vytvoření. A to
samozřejmě není možné…
Jako to tedy vyřešit? Snadno, přesunout 4 řádky z konstruktoru
LiveClientScript
do metody enable()
a pro příště
se nebát zdrojáků, chybka byla patrná na první pohled. :-)
Upravenou třídu si můžete stáhnout: opravený
LiveClientScript.
//Doplnění: soubor aktualizován, omylem jsem nauploadoval jinou verzi, než
jsem testoval v aplikaci.
Editoval Panda (19. 2. 2010 11:19)
- Jan Tvrdík
- Nette guru | 2595
Pokud se jako parametr $name
v metodě
addComponent
uvede NULL
, je použito jméno
komponenty.