Invalidace snippetu + JsonResponse
- Oli
- Člen | 1215
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
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
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…