Tutoriál na AJAX – nerozumím příkladu v dokumentaci

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
iNyxLadis
Člen | 48
+
0
-

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

Šaman
Člen | 2635
+
0
-

Jako že ti to funguje i bez těch scriptů?
A načte se to ajaxově? (Bez reloadu stránky?)

iNyxLadis
Člen | 48
+
0
-

Š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

Šaman
Člen | 2635
+
0
-

Pošli kód toho presenteru. Ideální by teda bylo nasdílet celý projekt, ale já podezírám presenter.

iNyxLadis
Člen | 48
+
0
-

Š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 | 2635
+
+1
-

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
+
0
-

Š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 :-).

Šaman
Člen | 2635
+
0
-

Jo, taky mi to vrtalo hlavou, dopsal jsem to k minulému příspěvku.

iNyxLadis
Člen | 48
+
0
-

Šaman napsal(a):

Jo, taky mi to vrtalo hlavou, dopsal jsem to k minulému příspěvku.

Perfektní. Jakmile se dostanu na počítač domů, tak si s tím trochu pohraju. Ještě jednou velké díky! :)

jiri.pudil
Nette Blogger | 1028
+
0
-

Š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
+
0
-

Š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)