pesistentni promena nefunguje-neziska hodnotu v ajax

vlkodlak
Člen | 160
+
0
-

zdavím,

udělal jsem jednoduchy test na Ajax, A po překonání chyb v me hlavě jsem se zasekla na nasledujicim:
jednoducha stránka s dvemy tlačitky pro increment a decrement hodnoty, akce ajaxu probehne, ale hodnota jak si nepohne.

HomepagePresenter.php

<?php

declare(strict_types=1);

namespace App\Presenters;

use Nette;


final class HomepagePresenter extends Nette\Application\UI\Presenter
{
    /** @persistent */
    public $cislo;

	public function handleAdd():void
	{
		$this->cislo=$this->cislo+1;
		$this->template->mycislo = $this->cislo;
		$this->redrawControl('pocitadlo');
	}

	public function handleRemove():void
	{
		$this->cislo=$this->cislo-1;
		$this->template->mycislo = $this->cislo;
		$this->redrawControl('pocitadlo');
	}

}

default.latte

{* This is the welcome page, you can delete it *}

{block content}
<div>
	<p>
		cas : {time()}
	</p>
	<article n:snippet="pocitadlo">
		cislo : {ifset $mycislo}{$mycislo}{else}neni definovano{/ifset}
	</article>
	<a class="ajax" n:href="add!">+ Add +</a>
	::
	<a class="ajax" n:href="remove!">- Remove -</a>
</div>

@layout.latte

<!DOCTYPE html>
<html>
<head>
	<meta charset="utf-8">
	<meta name="viewport" content="width=device-width">

	<title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
</head>

<body>
	<div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>

	{include content}

	{block scripts}
	<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
	<script type="text/javascript" src="{$basePath}/nette.ajax.js"></script>
	<script type="text/javascript" src="{$basePath}/main.js"></script>
	<script src="https://nette.github.io/resources/js/3/netteForms.min.js"></script>
	{/block}
</body>
</html>
galab
Backer | 74
+
0
-

Kde nastavuješ $this->cislo? Pokud v render metodě, ta je po handle a tím pádem ti to přepíše

vlkodlak
Člen | 160
+
0
-

@galab no jedine v homepresentru

    /** @persistent */
    public $cislo;

a pravdou je že nikde nenastavují výchozí hodnotu !? … no jo jak na to?

Editoval vlkodlak (20. 2. 2022 22:02)

galab
Backer | 74
+
0
-

Mrkni ještě na toto, jelikož máš includovanou šablonu.
https://doc.nette.org/…ication/ajax#…

vlkodlak
Člen | 160
+
0
-

obavam se, že to nebude ono, protože pokud vložim kus kodu primo do @layout.latte tak to nefunguje také

@layout.latte

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">

      <title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
   </head>

   <body>
      <div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>
      <div>
	 <p>
	    cas : {time()}
	 </p>
	 <article n:snippet="pocitadlo">
	    cislo : {ifset $mycislo}{$mycislo}{else}neni definovano{/ifset}
	 </article>
	 <a class="ajax" n:href="add!">+ Add +</a>
	 ::
	 <a class="ajax" n:href="remove!">- Remove -</a>
      </div>
      { include content}

      {block scripts}
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
      <script type="text/javascript" src="{$basePath}/nette.ajax.js"></script>
      <script type="text/javascript" src="{$basePath}/main.js"></script>
      <script src="https://nette.github.io/resources/js/3/netteForms.min.js"></script>
      {/block}
   </body>
</html>
galab
Backer | 74
+
0
-

A co ti vypíše browser konzola v záložce network/XHR? Tam bys měl vidět snippet v response

Editoval galab (20. 2. 2022 22:38)

vlkodlak
Člen | 160
+
0
-

možna ne zcela rozumim co mam hledat … tvé otázcekam se mam podivat a co uvidět … když v prohlizeči použiji f12 … v sitove komunikaci vše má 200, v ladence vidim GET http:// test / nette / AJAX / handler / www / www / ?cislo=1&do=add … ale cislo je stale beze zmeny 1

a jako typ se vypise bud script nebo xhr

Editoval vlkodlak (20. 2. 2022 22:47)

galab
Backer | 74
+
0
-

@vlkodlak mrkni na mail

vlkodlak
Člen | 160
+
0
-

děkuji @galab -ovi za inspirativní pomoc při odladění mého příkladu níže přikládam výsledné řešení pro ty co narazí na toto vlákno

HomepagePresenter.php

declare(strict_types=1);

namespace App\Presenters;

use Nette;

final class HomepagePresenter extends Nette\Application\UI\Presenter
{

   /** @persistent */
   public $cislo = 0;

   public function actionDefault($cislo = 0)
   {
      $this->cislo = $cislo;
   }

   public function renderDefault()
   {
      $this->template->cislo = $this->cislo;
   }

   public function handleAdd($cislo)
   {
      $this->cislo = $this->cislo + 1;
      $this->redrawControl('pocitadlo');
   }

   public function handleRemove($cislo)
   {
      $this->cislo = $this->cislo - 1;
      $this->redrawControl('pocitadlo');
   }

}

@layout.latte

<!DOCTYPE html>
<html>
   <head>
      <meta charset="utf-8">
      <meta name="viewport" content="width=device-width">

      <title>{ifset title}{include title|stripHtml} | {/ifset}Nette Web</title>
   </head>

   <body>
      <div n:foreach="$flashes as $flash" n:class="flash, $flash->type">{$flash->message}</div>

      {include content}

      {block scripts}
      <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
      <script type="text/javascript" src="{$basePath}/nette.ajax.js"></script>
      <script type="text/javascript" src="{$basePath}/main.js"></script>
      <script src="https://nette.github.io/resources/js/3/netteForms.min.js"></script>
      {/block}
   </body>
</html>

default.latte

{block content}
<div>
   <p>
      cas : {time()}
   </p>
   <article n:snippet="pocitadlo">
      cislo : {ifset $cislo}{$cislo}{/ifset}
      <br>
      <a class="ajax" n:href="add! $cislo">+ Add +</a>
      ::
      <a class="ajax" n:href="remove! $cislo">- Remove -</a>
   </article>

</div>

a za sebe doplním, pro jiné začatečniky, důležitou drobnost

main.js

$(document).ready(function () {

   $.nette.init();

})

Editoval vlkodlak (21. 2. 2022 15:57)