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 | 2668
 
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 | 668
 
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á.