Jak invalidovat snippet z nadřazené komponenty

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

Zdravim.

Zkouším anketní systém.

Komponenta PollDetail:
PollDetail.latte

{$poll->title}<br>

{snippet}
  {control voteForm-$poll->id}
  Tipy ostatních: {$poll->countVotes}
{/snippet}
<hr/>
ve které volám komponentu pro hlasování(voteForm):

    public function voteFormSubmitted( Form $form )
    {
        //ulozeni hlasu - to funguje

        //ale nevim jak prekreslit snippet o komponentu vys - v PollDetail.latte
        if ( !$this->presenter->isAjax() )
        {
            $this->presenter->flashMessage( "NENI FLASH", 'success' );
            $this->redirect( 'this' );
        }
        else
        {
            $this->presenter->flashMessage( "AJAX FUNGUJE", 'success' );
            $this->invalidateControl();
        }
}

Jak z toho kodu zavolam invalidaci snippetu o uroven vys? PollDetail.latte, který je v komponentě PollDetail ??
Děkuji za rady

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Invalidovat snippety v šabloně o úroveň výš lze takto:

$this->parent->invalidateControl();
motorcb
Člen | 552
+
0
-

vojtech.dobes:

Díky, ale to mi vrací chybu:
Nette\MemberAccessException
Call to undefined method Nette\Application\UI\Multiplier::invalidateControl().

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Tak na to je ještě lepší trik :) – vyhledání rodiče daného typu:

$this->lookup('Nette\Application\UI\Control')->invalidateControl();

Pokud je ten Multiplier přímo připojovaný k presenteru (jeho továrnička je v presenteru), vrátí to ten presenter.

Nicméně, měl bych zmínit, že mnohem lepší způsob je obohatit tvoji komponentu o rozhraní alá formuláře, tj. nadefinovat si události a místo tohoto výše uvedeného volání pouze zavolat tu událost. A ten rodič (presenter), který obsahuje továrničku tvojí komponenty, se sám zaregistruje do oněch události, a sám na sobě zavolá tu invalidaci. Je to mnohem hezčí architektura.

motorcb
Člen | 552
+
0
-

vojtech.dobes: Perfekt! To je přesně ono. Díky

Máš u mne pivo :)