Tutoriál na AJAX – nerozumím příkladu v dokumentaci
- iNyxLadis
- Člen | 48
Ahoj,
zkoušel se učit s Nette a narazil jsem u tohoto příkladu na věc, které
nerozumím.
https://doc.nette.org/…ication/ajax
Tutoriál má ukazovat na to, jak začít pracovat s jQuery a nette.ajax.js,
co mi není jasné je to, že se text po odkazu změní i bez vložených
{block scripts}
<script src=„{$basePath}/js/jquery.js“></script>
<script src=„{$basePath}/js/netteForms.js“></script>
<script src=„{$basePath}/js/nette.ajax.js“></script> {* Nette
Ajax depens on jQuery *}
<script src=„{$basePath}/js/main.js“></script>
{/block}
v template/@layout.latte a zmíněných scriptů ve složce ../js/
Jak je to možné?
Děkuji
- iNyxLadis
- Člen | 48
Šaman napsal(a):
Jako že ti to funguje i bez těch scriptů?
A načte se to ajaxově? (Bez reloadu stránky?)
Tomu právě nerozumím, založil jsem si uplně čistej projekt a vložil pouze kód do HomepagePresenter a Template/default.latte a v @layout.latte smazal veškerý scripty. A po kliknutí na odkaz se to stejně změní :-) nechápu
- iNyxLadis
- Člen | 48
Šaman napsal(a):
Pošli kód toho presenteru. Ideální by teda bylo nasdílet celý projekt, ale já podezírám presenter.
Vzal jsem to vlastně 1:1 z toho návodu zmíněného výše.
<?php
namespace App\Presenters;
use Nette;
use App\Model;
class HomepagePresenter extends BasePresenter
{
/** @var string */
private $anyVariable;
public function handleChangeVariable()
{
$this->anyVariable = 'changed value via ajax';
if ($this->isAjax()) {
$this->redrawControl('ajaxChange');
}
}
public function renderDefault()
{
if ($this->anyVariable === NULL) {
$this->anyVariable = 'default value';
}
$this->template->anyVariable = $this->anyVariable;
}
}
šablona pro homepage
<div id="content">
{snippet ajaxChange}
{$anyVariable}
{/snippet}
<a n:href="changeVariable!" class="ajax">Change variable!</a>
</div>
Díky za pomoc
Editoval iNyxLadis (15. 11. 2016 15:29)
- Šaman
- Člen | 2667
No jo, tak jsem si to zkusil a opravdu se změní. Ale ne ajaxově –
podívej se do adresního řádku.
Když to půjde ajaxem, tak ti neproběhne reload stránky a nezmění se
adresa. (Tedy, ta adresa by se nezměnila ani kdybys v tom handleru
přesměroval zase na pohled default, ale došlo by k reloadu stránky. Ajaxem
se má změnit JEN ten snippet s výpisem proměnné, ostatní by mělo zůstat
a nevykreslovat se znova).
Dodatek: Vtrá mi hlavou, jak je možné, že se proměnná v tom handleru přepíše. Tuším, že dřív tomu tak nebylo (ten příklad taky není k aktuálnímu Nette, ale k 2.0.1). Ale můžeš to zkusit upravit takhle:
<?php
public function handleChangeVariable()
{
$this->anyVariable = 'changed value via ajax';
if ($this->isAjax()) {
$this->anyVariable = 'OPRAVDU AJAX';
$this->redrawControl('ajaxChange');
}
}
?>
Editoval Šaman (15. 11. 2016 16:10)
- iNyxLadis
- Člen | 48
Šaman napsal(a):
No jo, tak jsem si to zkusil a opravdu se změní. Ale ne ajaxově – podívej se do adresního řádku.
Když to půjde ajaxem, tak ti neproběhne reload stránky a nezmění se adresa. (Tedy, ta adresa by se nezměnila ani kdybys v tom handleru přesměroval zase na pohled default, ale došlo by k reloadu stránky. Ajaxem se má změnit JEN ten snippet s výpisem proměnné, ostatní by mělo zůstat a nevykreslovat se znova).
Ježiš, to jsem si taky mohl uvědomit. Moc díky za Tvůj čas. Já celou dobu čekal, že se změna nepromítne totiž vůbec :-).
- jiri.pudil
- Nette Blogger | 1032
Šaman napsal(a):
Dodatek: Vtrá mi hlavou, jak je možné, že se proměnná v tom handleru přepíše. Tuším, že dřív tomu tak nebylo (ten příklad taky není k aktuálnímu Nette, ale k 2.0.1).
Proč by se neměla přepsat? Vždyť ji přepisuješ mimo
isAjax()
podmínku :)
- iNyxLadis
- Člen | 48
Šaman napsal(a):
No jo, tak jsem si to zkusil a opravdu se změní. Ale ne ajaxově – podívej se do adresního řádku.
Když to půjde ajaxem, tak ti neproběhne reload stránky a nezmění se adresa. (Tedy, ta adresa by se nezměnila ani kdybys v tom handleru přesměroval zase na pohled default, ale došlo by k reloadu stránky. Ajaxem se má změnit JEN ten snippet s výpisem proměnné, ostatní by mělo zůstat a nevykreslovat se znova).Dodatek: Vtrá mi hlavou, jak je možné, že se proměnná v tom handleru přepíše. Tuším, že dřív tomu tak nebylo (ten příklad taky není k aktuálnímu Nette, ale k 2.0.1). Ale můžeš to zkusit upravit takhle:
<?php public function handleChangeVariable() { $this->anyVariable = 'changed value via ajax'; if ($this->isAjax()) { $this->anyVariable = 'OPRAVDU AJAX'; $this->redrawControl('ajaxChange'); } } ?>
Tak jsem si s tím zkoušel pohrát a doladit program tak, aby skutečně ajax fungoval (přesně podle návodu). Bohužel se mi to nepodařilo. Do podmínky $this->isAjax mi to vůbec nespadne. Naimportované skripty mám, mám je inicializované v @layout.latte. Jedu na nejnovější verzi Nette, nette.ajax.js mám ve verzi 2.0.0 od Vojtěcha Dobeše a jQuery jsem stáhnul v aktuální verzi, tedy v 3.1.1. Co mi kde ještě může unikat?
EDIT: Chyba nalezena, překlep v šabloně.
Editoval iNyxLadis (16. 11. 2016 14:49)