Invalidace controls nefunguje
- suxik
- Člen | 62
Ahoj, mám několik controls v šabloně, snippety ohraničují různě ty controls a jejich vnitřky, ale při handleNeco, když volám invalidateControl(‚nazev_snippetu‘), tak se nic neinvaliduje, když dám jako snippet např.celý blok content, tak se mi invalidují úplně jiné controls atd. Co s tím?
Je to Nette 2.0, na starým jsem neměl problém, zavináčema jsem se protuneloval a vždycky to jelo jak má, takže nechápu postup „tunelování“ tady. Dočetl jsem se jen, že zavináče už nejsou potřeba.
šablona:
<?php
{snippet basket_icon}
{control basket:icon}
{/snippet}
<nejake html...>
{snippet searcher}
{control searcher}
{/snippet}
?>
a pak např. v šabloně searcher.latte mám
<?php
<form na hledání...>
{snippet results}
<ul>něco</ul>
{/snippet}
?>
a kód v komponentách při handle atd. jako:
<?php
if ($this->presenter->isAjax()) {
$this->invalidateControl('results'); // nefunguje
//$this->invalidateControl('searcher'); // taky nefunguje
} else {
$this->redirect('this');
}
?>
Javascript používám aktuální jquery.nette, payload v konzoli firebugu je správně naložená snippet obsahy. Jen prostě ta invalidace.
- joe
- Člen | 313
suxik napsal(a):
v konzoli firebugu je správně naložená snippet obsahy. Jen prostě ta invalidace.
Pokud ti v odpovědi Firebug ukazuje obsah snippetů a nedojde k chybě v JS (pokud vše funguje tak, jak má), pak je pravděpodobně ten obsah stejný, proto není vidět žádný efekt a „nic nefunguje“. Ivalidace ale probíhá → máš odpověď v payload.
Dál si je třeba uvědomit, že AJAX požadavek se chová jako klasický požadavek a to je v případě vlastních komponent přijímající AJAX požadavky nežádoucí – a nevšiml jsem si, že by to tady někdo nějak řešil a to mi přijde trochu divné.
Tzn. že třeba při přidání zboží do košíku (vlastní komponenta) se i při AJAXu znovu načte celá stránka (i když to nikde není vidět) a v payloadu se objeví jen to, co chceš.
Chyba je možná v tom, že sice invaliduješ snippet, ale jak životní cyklus prochází všemi dalšími fázemi, zase se ta komponenta změní a nakonec se odešlou stejná data, jako tam nyní jsou zobrazené.
Na tento problém jsem narazil například u komponenty PollControl a předtím jsem se to snažil nějak srozumitelně popsat v diskusi.
Zkus to tedy trochu upravit na
if ($this->presenter->isAjax()) {
$this->snippetMode = TRUE;
$this->invalidateControl('results');
$this->render();
$this->sendPayload(); // v tuhle chvíli končí životní cyklus a nepokračuje dál v presenteru -> také bys měl mít ve firebugu jen snippet results a nic jiného (pokud nic jiného jinde neinvaliduješ)
} else {
$this->redirect('this');
}
- knyttl
- Člen | 196
Suxik: jak jsi to nakonec vyřešil?
Např. mám-li v šabloně presenteru
{snippet snippetVPresenteru}
{control mujControl}
{/snippet}
a pak v šabloně controlu mujControl:
<text1 />
{snippet snippetVControlu}
<text2 />
{/snippet}
Tak potom jedine co funguje z controlu je:
<?php
$this->presenter->invalidateControl("snippetVPresenteru");
?>
SnippetVControlu se nikdy neinvaliduje a pokud invaliduji jen jeho, dostávám jen JSON se {„state“:{…}}, ale snippety v něm nejsou.
Zkoušel jsem tedy
<?php
$this->snippetMode = true;
?>
- vrací, že není control::$snippetMode je undefined.
<?php
$this->render();
$this->sendPayload();
?>
- proběhne jen render, což by bylo fajn, ale neudělá se z něho JSON.
Nesouvisí to nějak s https://github.com/…e/issues/160
(mám vývojovou verzi Nette z počátku července)
Editoval knyttl (4. 8. 2011 16:03)