„Životní cyklus“ Controly

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
_Martin_
Generous Backer | 679
+
0
-

Zajímalo by mě, jak přesně jsou volány metody Controly – konkrétně loadState, saveState a signalReceived. Zvláště u prvních dvou jsem narazil na jednu zvláštnost, ale nejsem si jist, zda jde o bug.

Metoda loadState – zdá se – je volána vždy a jako první. Ovšem metoda saveState je volána jenom někdy – a to mi přijde podivné. Pokud vytvořím komponentu v továrničce:

public function createComponentBar()
{
	$foo = new Bar; // je jedno, zda ji připojím hned
	return $foo;
}

a následně ji vykreslím v šabloně

{control bar}

metoda saveState zavolána NEBUDE.

Pokud k této komponentě přistoupím v presenteru:

public function actionDefault()
{
	$this['bar']; // toto stačí
}

bude metoda saveState zavolána celkem TŘIKRÁT.

Ovšem – pokud k ní přistoupím v presenteru, ale AŽ v metodě render:

public function renderDefault()
{
	$this['bar']; // toto stačí
}

bude metoda saveState zavolána JEDNOU.


Nyní zapojíme metodu signalReceived. Pokud je na komponentě volán signál, metoda saveState se provede vždy (i v případě, že ke komponentě nepřistupujeme v žádné z metod action, render a ani v šabloně). Metoda signalReceived je volána před posledním voláním metody saveState. V případě použití metody action (viz. výše) je pořadí volání následující:

  1. loadState
  2. saveState
  3. saveState
  4. signalReceived
  5. saveState

Ve zbylých případech je vždy:

  1. loadState
  2. signalReceived
  3. saveState

Jsem zmaten, pomůže mi to někdo objasnit? Prosím.

Honza Marek
Člen | 1664
+
0
-

Já ti to bohužel neobjasním, ale taky by mě to zajímalo. Až mě to bude zajímat ještě víc, tak bych třeba proved průzkum zdrojáků. Otázka je, jak moc je to zakuklené.

Panda
Člen | 569
+
0
-

Naprosto přesně to nevím, nicméně je to nějak takto:

loadState() je volán vždy při připojení komponenty k presenteru.

Pomocí metody signalReceived() se předává signál, tudíž je volána jen v případě, že voláme signál komponenty.

saveState() se volá v následujících případech:

  • Vytváření odkazu (nezkoumal jsem to přesně, ale zdá se, že v případě vytváření odkazu na signál persistentní komponenty může dojít až k dvojímu volání, ale s tím si nejsem jistý).
  • Ukládání „globálního stavu“ (saveGlobalState()) po volání afterRender() (ta se volá po render<action>()), ale před vykreslením šablony. Z toho tedy vyplývá, že pokud se komponenta vytvoří až v šabloně ({control bar}), k volání saveState() nedojde, protože v době volání saveGlobalState() ještě neexistuje. Pokud volám signál, komponenta se automaticky vytvoří a k volání dojde.

Doufám, že tomu je alespoň trochu rozumět a že nejsem úplně mimo…