Invalidace snippetu + JsonResponse

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

Ahoj,
nevím moc jestli to takhle půjde, ale pokusím se nastínit problém, kterej bych chtěl vyřešit.

Mám komponentu, která má v js zpracování JSONu

function load()
{
	$.getJSON( {link items!}, function( data )
	{
		// kod
	}
}

Při prvním načtení to funguje tak jak chci. Potřebuju, ale filtrovat data. Ideálně tak, že v šabloně presenteru zavolám signál, ten odchytnu v presenteru, zpracuju a pošlu výsledky do komponenty, kde se zavolá JsonResponse a ten se odešle template komponenty. Tohle je v pohodě. Potřeboval bych, ale zároveň znovu spustit tu js funkci load() aby se ty data co se nově poslali zpracovali…
Mám to takhle nějak:

//šablona presenteru
<li><a class="ajax" n:href="signal! array(1,2)" id="filterit">Pouze štítek pokus</a></li>

// presenter
public function handleSignal(array $filter)
{
	// ---- zpracování filtru

	$this['komponenta']->addItems($items);

	$this['komponenta']->invalidateItems();
	$this['komponenta']->invalidateControl('items');
}

// komponenta
public function addItems(Markers $items)
{
	$this->items = $items->getItems();
}

public function invalidateItems()
{
	$this->handleItems();
}

public function handleItems()
{
	$this->getPresenter()->sendResponse(new JsonResponse($this->items));
}

Tohle proběhne a data se mě v JSONu pošlou na klienta. Jak ale spustím znovu tu js funkci aby se provedla akec s tim JSONem?

Díky moc za rady.

Editoval Oli (4. 12. 2013 10:53)

Oli
Člen | 1215
+
0
-

Napadlo mě, nešlo by to tak, že bych invalidoval snippet jen s tou funkcí load? Že bych měl v šabloně komponenty:

{snippet item}
<script>
	load();
</script>
{/snippet}

Akorát nevím, jestli se ta js funkce provede a co bych měl předat v JSONu aby se ten snippet invalidoval. Co jsem se koukal, tak JSON respons je standardní při invalidaci. Akorát já k tomu potřebuju přidat vlastní snippet.

Je to takhle proveditelný?

Oli
Člen | 1215
+
0
-

Nakonec jsem to vyřešil tak, že to je funkční, ale ne moc pěkný řešení:

//šablona presenteru:
<a class="filter" href="#" id="2013">Pouze štítek 2013</a>
$(".filter").click(function(e){
	load(decodeURIComponent({link signal! array(2)}));
	e.preveventDefault();
});

// presenter
public function handleSignal(array $filter)
{
    // ---- zpracování filtru
    $this->sendResponse(new \Nette\Application\Responses\JsonResponse($items));
}

// šablona komponenty
function load(url)
{
	// zpracování
}

Mnohem radši bych byl, kdyby ten JSON odesílala komponenta, protože mě to tam logicky víc patří, ale to se mě nepodařilo funkčně rozchodit…