komponenty v includované šabloně a jejich vytvoření, které nechci :)

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

Ahoj,
mám následující problémek

mám nějaké komponenty, které pomocí @inject vkládám do presenteru.
Když mám v šabloně něco jako

<a n:href="updatuj!" class="ajax">Updatuj</a>

{snippet sn1}
	{control myControl1}
{/snippet}
{snippet sn2}
	{control myControl2}
{/snippet}
{snippet sn3}
	{control myControl3}
{/snippet}

a v presenteru třeba

public function handleUpdatuj() {
  	if ($this->isAjax()) {
   		$this->redrawControl("sn1");
	}
}

tak vše asi proběhne tak jak má a po kliknutí na odkaz se provede pouze createComponentyMyControl1() a ostatní createComponent… neproběhnou..

avšak pokud mám komponenty v includované šabloně

<a n:href="updatuj!" class="ajax">Updatuj</a>

{snippetArea snA}
	{include controls.latte}
{/snippetArea}

includovaná šablona vypadá nějak takto

{snippet sn1}
	{control myControl1}
{/snippet}
{snippet sn2}
	{control myControl2}
{/snippet}
{snippet sn3}
	{control myControl3}
{/snippet}

samozřejmě v presenteru handle upravím

public function handleUpdatuj() {
  	if ($this->isAjax()) {
   		$this->redrawControl("snA");
   		$this->redrawControl("sn1");
	}
}

tak v tuto chvíli proběhnou i funkce createComponentMyControl2 a createComponentMyControl3..což nechci, pač v těchto funkcích mám spoustu databázových dotazů, které nejsou nutné, aby se vykonávali, když chci updatovat prakticky jen první komponentu…

asi to bude nějaká maličkost, sem začátečník a možná nepoužívám nejlepší best practice pro tvorbu komponent, ale rád se nechám poučit jak správně to vše tvořit..hlavně bych rád se zbavil těch databázových dotazů v createComponentMyControl23, které nechci vykonávat, když upravuji pouze MyControl1..a taktéž chci zachovat ty includy, pač celé je to trošku složitější :)

dík za jakoukoli radu
–sevča

Editoval sevca79 (16. 10. 2017 14:14)

David Matějka
Moderator | 6445
+
+1
-

ahoj, obávám se, že jde o known limitation.

ve chvíli, kdy se zavolá invalidovaný snippet (nebo i snippetArea), tak se volá vše v něm, bez ohledu, jestli to také bylo invalidované. asi by to chování šlo změnit, ale mohl by to být BC break.

nebylo by lepší v tvém případě přesunout ty snippety do té komponenty a invalidovat je tam?