Invalidace více snippetů v komponentě

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

Zdravím.

V šabloně komponenty mám na stejné úrovni (tj. nevnořené do sebe) 2 snippety.

V signálu komponenty se je snažím oba invalidovat, bohužel se ale v JSONu odešle pouze ten první v závislosti na tom, který jako první invaliduji…

komponenta:

class Catalog extends UI\Control
{

	/** @persistent int */
	public $page = 1;


	/** @return void */
	function handleMore()
	{
		$this->page++;
		$this->invalidateControl('shows');
		$this->invalidateControl('more');

		!$this->presenter->isAjax() && $this->redirect('this');
	}

}

šablona:

<div n:snippet="shows" data-ajax-append>
	{foreach $shows as $show}
		{control $control:detail $show}
	{/foreach}
</div>


<p n:snippet="more">
	<a n:href="more!" class="ajax">More shows</a>
</p>

Jak jsem uvedl výše, tento kód mi v JSONu posílá pouze snippet shows.

V čem může být prosím problém?

Nette 2.0.11

studna
Člen | 181
+
0
-

Zajímavé. Napadlo mě jen zkusit to následovně, ale jistý si nejsem.

class Catalog extends UI\Control
{

    /** @persistent int */
    public $page = 1;


    /** @return void */
    function handleMore()
    {
        $this->page++;
        $this->template->link = $this->link("more!");
        $this->invalidateControl('shows');
        $this->invalidateControl('more');

        !$this->presenter->isAjax() && $this->redirect('this');
    }

}
<p n:snippet="more">
    <a href="{$link}" class="ajax">More shows</a>
</p>

A nebo nějaký problém s tím persistentním parametrem?

Editoval studna (13. 9. 2013 17:28)

uestla
Backer | 796
+
0
-

Rád bych opravil svoje tvrzení:

Ať už invaliduji snippety v jakémkoli pořadí, v JSONu se pošle vždy ten invalidní, který
je první v šabloně (tj. snippet shows) – jakoby se po jeho vykreslení komponenta celá
zvalidnila, kvůli čemuž nedochází k přenesení snippetu more :(

Zatím jsem to vyřešil ošklivým workaroundem:

<div n:snippet="shows" data-ajax-append>
	{foreach $shows as $show}
		{control $control:detail $show}
	{/foreach}

	{? $control->invalidateControl('more'); }
</div>
akadlec
Člen | 1326
+
0
-

Nemáš tam v rendereru komponenty zpětnou validaci toho druhého snippetu?