Automatické nastavení name componenty

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

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
+
0
-

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 LiveClientScriptu 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
+
0
-

Pokud se jako parametr $name v metodě addComponent uvede NULL, je použito jméno komponenty.