zamezení vytváření všech komponent presenteru při AJAXu
- mlha
- Člen | 58
Jak zamezím volání createComponent těch komponent pro, které není
určen signál?
Mohu v createComponent nějak otestovat, že se komponenta vlastně nemá
vytvářet, protože nebude překreslena.
V presenteru mám tři komponenty ovladané AJAXem. Jedna z nich je
DataGrid.
Při poslání signálu jedné z těch dvou ostatních, se ale stejně DataGrid
volá a vznikají zbytečné SQL dotazy.
Předem děkuji za pomoc.
- Patrik Votoček
- Člen | 2221
Nette nemá věštící kouli takže si budeš muset udělat v šabloně jeden IF navíc
- Panda
- Člen | 569
mlha napsal(a):
… ale v AJAX requestu je jasně posílán signál komponentě X, tak proč se volá i konstruktor (creator) ostatních komponent?
I když komponenta není příjemcem signálu, tak to neznamená, že se nemusí překreslovat. Komponenta si může řídit svojí invalidaci (a tím pádem i překreslování) sama, nezávisle na presenteru a na ostatních komponentách. A odesílání dotazů apod. záleží jen na komponentě a na tom, jak zručně je napsaná…
Jen tak mimochodem, nemáš před vykreslováním těch komponent zavináč?
Zápis @{control myComponent}
jasně říká: „vytvoř za
jakýchkoliv okolností komponentu myComponent
a pokus se jí
vykreslit“.
- mlha
- Člen | 58
Děkuji za vysvětlení. Už mi začíná svítat :)
Zkoušel jsem tedy následující:
Přejmenoval jsem createComponentGrid na contructGrid a snažil jsem se
pořešit vytváření této komponenty vlastní cestou, a omezit jej jen na
nejnutnější případy.
Komponentu jsem běžně vytvářel v startup() – mimo AJAX vždy, při
AJAXu jen když je pro ní signal.
Vykreslení i fungování komponenty bylo bez problémů.
Problémy ale nastanou při AJAXovém requestu pro jinou komponentu XY. V tu
chvíli se komponenta Grid nevytvoří (snaha ušetřit – XY vůbec Grid
nepoužívá) a request končí chybou.
Soustředil jsem se tedy na zkoumání DataGridu. Snažím se DG donutit
volat SQL až když je to nezbytné. SQL se teď volá až při
renderování.
Otázka: Lze nějak v průběhu renderování zjistit, zda se bude komponenta
překreslovat?
- otestovat signál, AJAX, isControlInvalid?
- mlha
- Člen | 58
Mám problém s metodou isControlInvalid. Příklad s výkonné metody presenteru.
<?php
$grid = $this->getComponent('grid');
Debug::log('BEFORE:'.var_export($this->isControlInvalid('grid'), true));
//vypise FALSE
$grid->invalidateControl();
Debug::log('AFTER:'.var_export($this->isControlInvalid('grid'), true));
//vypise rovněž FALSE !!!
?>
Dělám něco blbě, nebo je někde chyba?
Editoval mlha (9. 8. 2010 14:18)
- mlha
- Člen | 58
Objasněno, správně má být:
<?php
$grid = $this->getComponent('grid');
$grid->invalidateControl();
Debug::log('AFTER:'.var_export($grid->isControlInvalid(), true));
?>
Celý problém jsem prozatím vyřešil úpravou DataGridu
Editoval mlha (9. 8. 2010 21:52)
- crempa
- Člen | 198
Mam presne opacny problem, pri ajax submitu formulare
<?php
//zjednodusene
public function submit($form)
{
$formValues = $form->getValues();
$this->mainModel->updateItem($this->editId, $formValues);
$this->invalidateControl('formpopup');
$this->template->showForm = false;
$this->payload->status = true;
}
?>
se ihned odesle odpoved a na tvorbu dalsich komponent se nedostane, potreboval bych jeste vytvorit a invalidovat komponentu tabulky tak aby se v odpovedi na submit formulare aktualizoval jeji obsah
formular tvorim klasicky v tovarnicce a je obalen do snippetu ‚formpopup‘ tak aby bylo mozny ridit jeho ajax zobrazeni
pokud vynecham invalidaci ‚formpopup‘ tak se i pres ajax dotaz neaktivuje ajax driver a na vystupu je klasicke html s celou strankou…
nejaky napad jak docilit i nasledneho dalsiho vytvareni/invalidaci komponent ? diky
Editoval crempa (31. 12. 2010 10:24)