Ajaxový dotaz na signál v komponentě

Marek Znojil
Člen | 90
+
+1
-

Ahoj,

nevím si rady s ajaxovým dotazem na signál v komponentně.

Mám napsaný skript v js, který umožňuje měnit pozice řádků v tabulce. V události po odkliknutí vytvořím CustomEvent, který si později odchytávám dle id tabulky a v něm Najou provedu dotaz ajaxu na signál komponenty.

Dotaz se vykoná, avšak vrací pouze {„state“:[]}.

Používám snippetArea v šabloně presenteru a pak samotný snippet v šabloně komponenty, ale i tak to neodešle požadovaný snippet v dotazu.

V šabloně presenteru:

{snippetArea componentWrapper}
  {control ..}
{/snippetArea}

V šabloně komponenty:

{snippet items}
  ..
{/snippet}

A handle v komponentě:

public function handleChangeItems(): void{
  if($this->presenter->isAjax() === true){
      bdump('ajax');  // Zobrazí se v Tracy po ajax dotazu.
      $this->presenter->redrawControl('componentWrapper');
      $this->redrawControl('items');
  }
}

Netušíte někdo, kde by mohl být problém?

Díky,

M.

Marek Znojil
Člen | 90
+
0
-

Opravdu nikdo netuší proč se mi nevrací snippety?

Felix
Nette Core | 1197
+
+1
-

Zkusim si to nasimulovat u sebe. Ale nevim kdy to bude hotove. Jen at vis. Vic udelat memohu.

Marek Znojil
Člen | 90
+
0
-

Felix napsal(a):

Zkusim si to nasimulovat u sebe. Ale nevim kdy to bude hotove. Jen at vis. Vic udelat memohu.

Ahoj,

děkuji moc!

Vím, že se to zde řešilo mnohokrát a většinová odpověď byla použití snippetArea či se vyhnutí více render metod pro komponenty.

Je to opravdu zajímavé chování, jelikož se vše provede v handle jak má až na odeslání snippetu.

stepos2
Člen | 53
+
0
-

snippetArea se používá při inkludování šablon. To není tenhle případ. Mělo by stačit

{control ..}
public function handleChangeItems(): void
{
	if ($this->presenter->isAjax() === true) {
		$this->redrawControl('items');
	}
}

Editoval stepos2 (5. 4. 2021 15:09)

Marek Znojil
Člen | 90
+
0
-

stepos2 napsal(a):

snippetArea se používá při inkludování šablon. To není tenhle případ. Mělo by stačit

{control ..}
public function handleChangeItems(): void
{
	if ($this->presenter->isAjax() === true) {
		$this->redrawControl('items');
	}
}

Bohužel nestačí. V tomto případě to hodí chybu, že neexistuje render metoda komponenty.

stepos2
Člen | 53
+
+1
-

Nejspíš předáváš komponentě nějaký parametry přes render metodu. Při překreslení vnitřku komponenty se tahle informace ztratí. Pro tyhle účely je potřeba předávat komponentě parametry přes konstruktor.

Pro rychlý fix zkus místo té snippetArey použít obyčejný snippet.

Marek Znojil
Člen | 90
+
0
-

stepos2 napsal(a):

Nejspíš předáváš komponentě nějaký parametry přes render metodu. Při překreslení vnitřku komponenty se tahle informace ztratí. Pro tyhle účely je potřeba předávat komponentě parametry přes konstruktor.

Pro rychlý fix zkus místo té snippetArey použít obyčejný snippet.

Pomohlo děkuji. Nechápu, že jsem to nezkusil hned ze začátku..

Jinak tuto komponentu vytvářím přes accessor dle typu, takže využívám konstruktor či setter.

stepos2
Člen | 53
+
0
-

Asi záleží, kde ten setter nebo konstruktor voláš. Obecně jsou komponenty schopné překreslit samy sebe, nemusí se vůbec sahat do presenteru.

Marek Znojil
Člen | 90
+
0
-

stepos2 napsal(a):

Asi záleží, kde ten setter nebo konstruktor voláš. Obecně jsou komponenty schopné překreslit samy sebe, nemusí se vůbec sahat do presenteru.

Právě, když jsem zkoušel pouze snippet v šabloně komponenty, tak mi to nešlo.

Proto jsem zkoušel snippetArea a následné překreslení ještě z presenteru.