invalidace dynamickych snippetu – ajax se provede jen jednou

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

Zdravim,
podle navodu zde https://doc.nette.org/…mic-snippets
jsem si vytvoril vlastni komponentu ktera je vypisovana ve foreachi a chci pomoci ajaxu menit stav = (otevreno / zavreno, podobne jako dvere :) takze by to melo fungovat jako toggle, tzn. ze tam nemam dve metody zavri a otevri ale jen jednu co se jmenuje zmenstav

narazil jsem ale na problem, kdy jsem sice priklad zprovoznil, nicmene ajax funguje pro dane volani vzdy jen poprve, a podruhe se stranka uz vzdycky refreshne :(

prisel jsem na to, ze kdyz v handleru zakomentuju metodu invalidateControl tak se handler provede a udela spravne zmenu v DB, jen se komponenta pochopitelne neprekresli. Kazdopadne muzu klikat jak kolikrat chci a zmena se provede presne tolikrat a uz bez refreshe stranky.

Nevim jestli jsem nekde neco neprehledl v dokumentaci, kazdopadne se to chova divne a uz nevim co dal, neresil jste nekdo neco podobneho?

diky moc!

P.S. tady je handler:

public function handleCaseStateUpdate()
    {
        //.. logika ulozeni do DB....

         if ($this->presenter->isAjax()) {
             $this->invalidateControl();
         } else {
             $this->presenter->redirect('this');
         }
    }
Ot@s
Backer | 476
+
0
-

Pravděpodobně „nefunguje ajax“ na odkazech, které jsou součástí snippetu. Pokud používáš nette.ajax.js od Vojty Dobeše, tak si někam přidej tento JS:

$.nette.ext('load', {
	success: function () {
		$.nette.load();
	}
});
donmoron
Člen | 6
+
0
-

Ot@s napsal(a):

Pravděpodobně „nefunguje ajax“ na odkazech, které jsou součástí snippetu. Pokud používáš nette.ajax.js od Vojty Dobeše, tak si někam přidej tento JS:

Diky,
zkusil jsem to, ale hazi mi to tuhle hlasku : „Cannot override already registered nette-ajax extension ‚load‘.“

zkousel jsem to davat na ruzna mista v sablone, ale bez uspechu. Mozna je to tim ze v JS nejsem prilis kovanej

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

Pokud používáš nette.ajax.js, tak kód registrující rozšíření load nikam nedávej, protože ta je zaregistrovaná automaticky.

A nyní nastal čas ukázat všechen JS, který je na stránce, aby se dal problém vyřešit :).

donmoron
Člen | 6
+
0
-

A nyní nastal čas ukázat všechen JS, který je na stránce, aby se dal problém vyřešit :).

vse co mam na strance je toto a je to umistene ve footeru:

{block scripts}
	<script type="text/javascript" src="{$basePath}/js/jquery.js"></script>
   <script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
	<script type="text/javascript" src="{$basePath}/js/main.js"></script>
   <script type="text/javascript" src="{$basePath}/js/jquery.bgiframe.js"></script>
	<script type="text/javascript" src="{$basePath}/js/jquery.suggest.js"></script>
   <script type="text/javascript" src="{$basePath}/js/netteForms.js"></script>
   <script type="text/javascript" src="{$basePath}/js/nette.ajax.js"></script>
	<script type="text/javascript" src="{$basePath}/js/suggestInput.js"></script>
   <script type="text/javascript">
       $(function () {
           $.nette.init();
       });
   </script>
	{/block}

a komponenta co v ni je ajax vypada komplet takhle:

{snippet}
{if $canModify}
<a class="ajax" n:href="caseStateUpdate!">
{/if}
    {if $case->caseState == 0}
        <img alt="bullet" src="{$basePath}/images/bullets/bullet_ball_glass_red_s.png"/>
    {elseif $case->caseState == 1}
        <img alt="bullet" src="{$basePath}/images/bullets/bullet_ball_glass_green_s.png"/>
    {else}
        <img alt="bullet" src="{$basePath}/images/bullets/bullet_ball_glass_yellow_s.png"/>
    {/if}
{if $canModify}
</a>
{/if}
{/snippet}

dekuju moc!

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Vyhodil bych jquery.nette.js, od toho je tam nette.ajax.js.

donmoron
Člen | 6
+
0
-

vojtech.dobes napsal(a):

Vyhodil bych jquery.nette.js, od toho je tam nette.ajax.js.

si kral Vojto, pomohlo, dekuju moc! :]