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)