Po invalidaci Control potomka se neinvaliduje rodič

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

Ahoj. Do presenteru mám připojenu jednu komponentu pro zobrazení uživatelů a do této komponenty mám připojenou další komponentu pro řazení (VisualPaginator upravený pro ajax). Šablony všech komponent začínají direktivou snippet. Pokud v komponentě pro řazení odchytím pomocí handle signál a invaliduji komponentu ($this->invalidateControl()), pak se znovu vykreslí jen komponenta VisualPaginator, ale její rodič ne. Funguje $this->parent->invalidateControl(), ale podle manuálu by se automaticky měla po invalidaci podřízené komponenty stát invalidní i nadřízená. Proč tomu tak není? A co mám kde nastavit aby tomu tak bylo?

jiri.pudil
Nette Blogger | 1029
+
0
-

Kde a jak ty komponenty vytváříš / připojuješ?

vasek125
Člen | 34
+
0
-

V šablonách mám {control …} a v presenterech metoda createComponentNAZEVKOMPONENTY, která vrací instanci komponenty (return new …).

duke
Člen | 650
+
0
-

vasek125 napsal:

Ahoj. Do presenteru mám připojenu jednu komponentu pro zobrazení uživatelů a do této komponenty mám připojenou další komponentu pro řazení (VisualPaginator upravený pro ajax). Šablony všech komponent začínají direktivou snippet. Pokud v komponentě pro řazení odchytím pomocí handle signál a invaliduji komponentu ($this->invalidateControl()), pak se znovu vykreslí jen komponenta VisualPaginator, ale její rodič ne.

Toto je IMHO správné chování. Kdyby to tak nebylo, invalidace libovolné subkomponenty (či jen jejího snippetu) by v důsledku vedla na překreslení všech nadřazených komponent, což obecně vzato není žádoucí. Např. snippety by pak v podstatě ztratily smysl. Ve speciálních případech, kdy to žádoucí je, toho lze dosáhnout jinak.

Funguje $this->parent->invalidateControl()

Např. takto, i když toto nepovažuji za nejrozumější řešení.
Lepší je např. přidat událost onInvalidate (či konkrétnější) do komponenty paginátoru a v nadřazené komponentě volat něco jako:

$this['paginator']->onInvalidate[] = callback($this, 'invalidateControl');

…, ale podle manuálu by se automaticky měla po invalidaci podřízené komponenty stát invalidní i nadřízená. Proč tomu tak není? A co mám kde nastavit aby tomu tak bylo?

Invalidní komponenta je komponenta, jejíž část (ne nezbytně ji celou) je třeba překreslit. Tuto definici splňuje, i když se bude překreslovat jen její subkomponenta (např. paginátor), neboť ona subkomponenta je její součástí. Takže manuál je nejspíš v pořádku.