Ajax vrací html stánku namísto json dat
- joseff
- Člen | 233
Zdravim, snažim se o svůj prvni ajax požadavek. Dosáhl jsem toho že při kliku na odkaz se data neodešlou klasicky ale přes ajax. V prezenteru se vykoná daná operace, ale pokud na konci action zavolam redirect tak aplikace funguje dobře, vrátí data v json formátu, ale ihned potom se přesměruje, což samozřejmě nechci. No a pokud tam ten redirect nedám, tak se vrátí Internal server error. A pokud tam dám setView tak se v odezvě vrátí klasická html stránka místo json dat. Nevíte někdo kde může být chyba?
- Patrik Votoček
- Člen | 2221
bez kódu těžko hádat. nicméně pokud tam nemáš žádný snippet tak se ti posílá celá stránka (HTML).
- joseff
- Člen | 233
Jo já myslel že jsem ten kód popsal dostatečně. Tak ho ještě přikládám, tento kod tedy pri ajaxovam pozadavku vrati Internal server error. Vice v mem prvnim prispevku.
šablona default.phtml:
<a href="{link pokus}" class="ajax">testuj</a>
{snippet prekresli}
$cokoliv
{/snippet}
V prezenteru:
public function actionDefault()
{
$this->template>cokoliv = 'nic';
}
public function actionPokus()
{
$this->template->cokoliv = 'hura';
}
- Šaman
- Člen | 2659
default.latte
// tohle by nemělo být potřeba, ale bez toho mi ajaxové požadavky načítá normálně s reloadem
<script type="text/javascript">
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
</script>
<a href="{link pokus!}" class="ajax">testuj</a>
{snippet pokus}
{$pokus}
{/snippet}
Presenter.php
private $pokus = "default";
public function renderDefault()
{
$this->template->pokus = $this->pokus;
}
public function handlePokus()
{
$this->pokus = "Ajax!";
if ($this->isAjax())
{
$this->invalidateControl('pokus');
}
}
Odzkoušeno s poslední verzí Nette bez prefixů a se skriptem
jquery.nette
zkopírovaným z exámplu Fifteen.
Editoval Šaman (13. 3. 2011 15:57)
- bojovyletoun
- Člen | 667
Chyba je, že odkaz vede na akci místo na signál. Myslím, že akce se
k tomuto účelu nepoužívají (šlo by to vůbec)? Přinejmenším máš
definovanou šablonu pokus.latte? Takže actionPokus přejmenuj na handlePokus
v odkazu bude pokus!
- m43x
- Člen | 1
zdravim,
Imho:
Action/render:
v podstate rozdiel je iba v tom ze pri volani action/render cez ajax
potrebujes mat zadefinovanu *.latte (co je uplne zbytocne v tomto pripade,
navyse bez template to hodi 500 co je spravne).
Handle:
vyhoda handle je v tom ze template „nemusi byt zadefinovany“ teda iba
invalidujes snippet.
v kazdom pripade ajax je mozne volat aj na action.
Editoval m43x (14. 3. 2011 9:31)
- montun
- Člen | 2
Mě ajax nefungoval, když jsem měl vloženo za $application->run(); echo a výpis logů. Používám vlastní systém logování proměnných, který během vykonávání aplikace naplní statickou proměnou a tu pak vykreslí na konci stránky. To jestli je to vykreslení dobře umístěné v aplikaci bych neřešil, ale pro všechny nováčky toto může být dobrý návod, jak přijít na to proč nefunguje JSON jak má.