Jak provést invalidaci vybraných komponent

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

Zdravím,
jakým způsobem je možné invalidovat všechny dostupné komponenty? Tzv. procházet komponentu po komponentě a postupně každou invalidovat. Díky za rady.

Majkl578
Moderator | 1364
+
0
-

Pokud invaliduješ komponentu, invalidují se i všichni její potomci. Nestačilo by ti $this->invalidateControl() (mělo by fungovat v presenteru i komponentách)?

bumprask
Člen | 59
+
0
-

Právě, že takhle mi to nešlo. Komponentu lze invalidovat takto $this[‚nazev-komponenty‘]->invalidateControl(). Ovšem já bych spíše potřeboval získat seznam všech komponent a jednu po druhé takto invalidovat, existuje sice metoda getComponents(), která ale vrací iterátor, s kterým nevím jak pracovat. Poradil by někdo jak získat data za metody getComponents(), abych je mohl vypsat v cyklu a postupně invalidovat?

Majkl578
Moderator | 1364
+
0
-

S iterátorem jde pracovat podobně jako s poli, alespoň co se iterací týče. Lze tedy použít foreach:

foreach ($this->getComponents() as $component) {
	$component->invalidateControl();
}

Nebo by to šlo i elegantněji jinak:

iterator_apply($this->getComponents(), function ($component) {
	$component->invalidateControl();
	return TRUE;
});
bumprask
Člen | 59
+
0
-

Díky za info, ovšem nevím proč, ale neinvaliduje se to správně, request je v json ovšem response nevrátí invalidované snippety ale pouze text/html, tedy k obnovení snippetů nedojde…

PS: ->getComponents() vrací všechny doposud vytvořené komponenty?