Invalidace snippetu v komponentě

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

Zdravím, nedaří se mi zprovoznit překreslení snippetu v komponentě. Posílám nástin mého kódu (osekaný od nepodstatných věcí):

Presenter:

class SearchPresenter extends BasePresenter
{
    /** @var IProducts @inject */
    public $products;

    ...

    protected function createComponentProducts()
    {
        return $this->products->create();
    }
}

Component:

class Products extends Control
{
    ...

	public function render()
	{
		$this->template->setFile('products.latte');
		$this->template->render();
	}

	public function handleLoad()
	{
		$this->redrawControl('listing');
	}
}

Šablona presenteru:

{control products}

Šablona komponenty (products.latte):


{snippet listing}
  {rand()}
{/snippet}

<a class="ajax" n:href="load!">Další produkty</a>

Po kliknutí na odkaz „Další produkty“ se odešle ajaxový požadavek, ovšem snippet „listing“ se nepřekreslí. Nějaká rada, co dělám špatně?

David Matějka
Moderator | 6445
+
0
-

kdyz se kouknes do dev tools v prohlizeci na network, jak vypada response od serveru?

MikeLacroix
Člen | 60
+
0
-

Tak už jsem přišel na to, v čem je problém. V presenteru mi ajaxové volání odchytí tohle:

public function renderDefault()
{
	...
	if ($this->isAjax()) {
		...
		$this->sendResponse(new JsonResponse([...]));
	}
}

…takže do komponenty se ten ajaxovy pozadavek uz nedostane. Takze moje otázka teď zní trochu jinak:

Jak elegantně v presenteru zjišťovat, o jaký ajaxový požadavek se jedná? Zatím to mám uděláno přes kontrolu ‚do‘ parametru. Takže tam mám něco jako:

if ($this->isAjax() && $this->params['do'] != 'komponenta-signal') { ... }
Ondřej Kubíček
Člen | 494
+
+4
-

spíš použij isSignalReceiver https://doc.nette.org/…n/components#…

MikeLacroix
Člen | 60
+
0
-

Paráda, díky!