zamezení vytváření všech komponent presenteru při AJAXu

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

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
+
0
-

Nette nemá věštící kouli takže si budeš muset udělat v šabloně jeden IF navíc

mlha
Člen | 58
+
0
-

V šabloně? Ale čím bych to měl podmínit?

Že Nette neumí věštit chápu :), ale v AJAX requestu je jasně posílán signál komponentě X, tak proč se volá i konstruktor (creator) ostatních komponent?

Jestli ten podnět vychází ze šablony, tak prosím o příklad podmínky.

Panda
Člen | 569
+
0
-

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
+
0
-

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
+
0
-

Panda napsal(a):

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“.

Ano toto tam mám. Jinak bych nemohl zobrazovat komponenty AJAXově.

mlha
Člen | 58
+
0
-

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
+
0
-

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
+
0
-

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)