Ajax a překreslování snippet-y
- vlkodlak
- Člen | 175
Zdravím Pánové, zkoušim pochopit fungování s překreslováním snippetu pomoci ajax. A vše by i fungovalo, jen nemohu najit chybu proč se mi překresluje vždy cela stránka a ne jen jedna konkretní část kodu.
jako základ jsem použil příklad: https://gist.github.com/…gern/4672895
Na stránce jsou dvě časové razítka (v komponentě a v presentru) a očekával bych že bude se měnit jen jedno (to které vložené do komponenty a to které je v HomepagePresenter-u zůstane neměnné. Mění se obě ať použijí jakékoliv refrešování a neumím pochopit proč?
com.latte
{* Component template *}
<div style="border-style: solid; border-width: 1px;">
<h4>Komponenta</h4>
<p>Jméno komponenty: {$control->name}</p>
{snippet componenta}
<p>Čas vykreslení:<?php echo time();?></p>
{/snippet}
<p><a n:href="refresh!" class="ajax">REFRESH (invalidování)</a></p>
</div>
com.php
<?php
/**
* Componenta Com
*/
namespace App\Components;
use Nette;
class Com extends Nette\Application\UI\Control
{
public function render()
{
$this->template->setFile(__DIR__ . '/Com.latte');
$this->template->render();
}
public function handleRefresh()
{
if( $this->parent->isAjax() ) {
$this->redrawControl('componenta');
} else {
// redirect může jen presenter, nikoliv komponenta
$this->parent->redirect('this');
}
}
}
default.latte
{* HomepagePresenter:default *}
{block content}
{snippet componentabig}
{control com}
{/snippet}
<h4>Presenter</h4>
<p>Čas: <?php echo time();?></p>
<p>
| <a n:href="refresh!" class="ajax">Obnov komponentu</a>
| <a n:href="refreshDelay!" class="ajax">Obnov komponentu (čeká 25s)</a>
| </p>
HomepagePresenter.php
<?php
namespace App\Presenters;
use Nette;
use App\Model;
class HomepagePresenter extends BasePresenter
{
public function renderDefault()
{
$this->template->time = date(DATE_RFC822);
}
public function handleRefresh()
{
if ($this->isAjax())
{
$this['com']->redrawControl('componenta');
} else
{
$this->redirect('this');
}
}
public function handleRefreshDelay()
{
if ($this->isAjax())
{
sleep(25);
$this['com']->redrawControl('componenta');
} else
{
$this->redirect('this');
}
}
protected function createComponentCom()
{
return new \App\Components\Com();
}
}
- cendak
- Člen | 21
Tak jsem nad tím přemýšlel a nedá se vyloučit to, že máš správně spuštěnou podporu nette ajax a skutečně provádíš ajaxové požadavky. Tedy připojenou nette.ajax.js a provedenou její inicializaci. Jinak kód co jsi uvedl vypadá, že by měl fungovat.
Zkus v jakékoliv metodě ověřit, že opravdu provádíš ajaxový
požadavek: v kódu třeba takto
\Tracy\Debugger::fireLog($this->isAjax());
. Také prozkoumej co
ti server vrací, ideálně ve Firebugu, nebo nečem takovém, zda ti vrací
skutečně XHR a zda-li je to JSON a obsahuje
klíč snippets.
Editoval cendak (25. 4. 2016 10:21)
- vlkodlak
- Člen | 175
@CZechBoY > Na stránce jsou dvě časové razítka (v komponentě a v presentru) a očekával bych že bude se měnit jen jedno (to které vložené do komponenty a to které je v HomepagePresenter-u zůstane neměnné. Mění se obě ať použijí jakékoliv refrešování a neumím pochopit proč?
@cendak > diky zkusim dam vědět
Editoval vlkodlak (25. 4. 2016 11:13)
- vlkodlak
- Člen | 175
cendak napsal(a):
vlkodlak napsal(a):
@cendak > tak, dle konzole to probíhá :( mohl bych Ti poslat složku APP k nahlédnutí např. přes úschovnu? … koukám na to tak dlouho, že již dělám hlouposti
jo klidně
v přiloženém příkladu mám dvě časová razítka v komponentě a v hlavní šabloně a čekal bych že překresleni bude se dit na úrovní komponenty, ale překresli se cela web stránka a nevidím proč :( … děkují za ochotu
- GEpic
- Člen | 566
Jen tip:
# toto:
<?php echo time();?>
# se dá zapsat v Latte také takto:
{time()}
Jinak je rozdíl v tom, jestli se ti stránka „překreslí“ nebo „redirectne“ (když píšeš, že se překreslí celá). Tracy ti vypíše, pokud se jedná o AJAXový požadavek, nebo ne. Poznáš to tak, že místo nápisu TRACY, bude napsáno AJAX.
Editoval GEpic (25. 4. 2016 21:26)
- GEpic
- Člen | 566
CZechBoY napsal(a):
@GEpic to bude asi nějaká extension… mně to žádný AJAX místo TRACY nepíše
Přišel jsem na to zrovna včera, když jsem tvořil čistou instalaci
(klasicky composer require nette\nette
), nic víc, žádná
extension.
Samozřejmě poslední dev verzi, nevím, jestli je to ve stable.
EDIT:
Viz. obrázek
Editoval GEpic (25. 4. 2016 21:38)
- cendak
- Člen | 21
Jak jsme viděl ten kód shrnul by to takto:
- Neprovadí se ajaxový ti požadavek na odkazu s class? Opravdu
připojuješ nette.ajax.js a provádíš jeho inicializaci
$.nette.init();
? - Provádí se ti ajaxový požadavek, ale v JSON odpovědi není klíč
snippet? A opravdu máš snippet správně v latte
{snippet mujSnippet}...{/snippet}
a opravdu provádíš jeho invalidaci v příslušném presenteru či komponentě$this->redrawControl('mujSnippet')
? - Zkusil jsi v componentě či presenteru ověřit, že jsi ve správně
podmínce
if ($this->presenter->isAjax()) { \Tracy\Debugger::fireLog("ajax mode"); }}