Po invalidaci formulare se vytrati vsechny javascripty

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

Po prekresleni se mi buhvi proc vytrati vsechny javascripty, navazany ckeditor na textaree atd… Nemate tuseni, kde by mohl byt problem, nebo jak ty javascripty znovu inicializovat po prekresleni?

Delam pod:
Nette Framework 2.0-alpha 2 pro PHP 5.3.

Martin
Člen | 171
+
0
-

Jak ztratí? Zmizí z kódu, nebo jen nefungují?

Ja
Člen | 260
+
0
-

promin, spatna formulace, nefunguji

Patrik Votoček
Člen | 2221
+
0
-

Předpokládám že se tak neděje po invalidaci ale při ajaxovém překreslení snippetu. A je to proto protože je měněna DOM struktura na kterou jsou navázány události. Tj. musíš znovu inicializovat ony události aby se znova napojili.

bojovyletoun
Člen | 667
+
0
-

tohle jsem řešil, napíšu některé možnosti: při refreshování snipetů použít

  • .live (předtím .die kvůli vícenásobnému navázání – na to pozor – třeba 5× odešleš formulář a pak to zavaří procesor a potažmo síť) – oproti bind funguje, když dynamicky přidáváš ajaxové formy/odkazy
  • bind(/unbind – ze stejného důvodu)
  • livequery plugin – to asi bude nejlepší řešení, ale já zvolil live
Ja
Člen | 260
+
0
-

Diky moc za nakopnuti, nemeli byste nekdo odkazy na nejaky materialy, abych se mel ceho chytit? (noob alert :))

22
Člen | 1478
+
0
-

@bojovyletoun: sry za OT, to je fakt s tim die()? Z čeho vycházíš? v dokumentaci se nic takového nepíše, že by se mělo volat die(). To jako jakože se ti ten ten event naváže 5x? Moc to nechápu, co tím myslíš? http://api.jquery.com/live/
Jinak mám pocit, že bind() ti nic neřeší při překreslení snippetu, protože pro DOM jsou to nové elementy a bind() se ti tedy nikam nenaváže.

Editoval 22 (15. 5. 2011 13:21)

bojovyletoun
Člen | 667
+
0
-

1: prostuduj toto: https://componette.org/search/?…

Já to dělám tak, že inicializaci formů a všeho dělám po každém requestu. Z toho důvodu, pokud je samotný form ve snippetu, tak je třeba inicializovat validaci atd.

Příklad z praxe

  • Případ, kdy je form ve snippetu, je třeba komentář pod článkem. Po odeslání form zmizí a místo něj se třeba ukáže „Názor přidán“.
  • Nebo nějaké ajaxové filtry – nebo „spojené“ nádoby (inputy) – napadá mě převodník jednotek. Po prvním odeslání by se form neinicializoval při použítí bind.

K die

kdybych nevolal die, tak počet requstů při každém dalším odesláním formu roste xponencielně – 1,2,4,8,16.

Live

Řešil jsem obslužný js docela dlouho a nakonec došel právě k tomuto. Bind vyřadím hned – je nutné ho volat po každém requstu a kromě toho nepokryje, když třeba dynamicky vytvořím ajaxový odkaz. U ajaxových odkazů je to jednoduché – tam stačí přidat handler k události click – na to se hodí live. U formů je nutná i inicializace předem – tam je nutné (pro formy ve snippetu při překreslení) je znovu inicializovat. Až budu používat livequery, tak stačí jen na začátku skriptu $(form).livequery(function(){nette.initform()} – samozřejmě zjednodušeně – jq se postará o inicializaci ve vhodnou chvíli.
Taky bude nutné promyslet to z hlediska výkonu – livequery dokáže žrát výkon.

No vypadá to, že se asi pustím do předělávání skriptu.

Poznámka

Co vy ostatní na to – považujete za dynamické přidávání ajaxových odkazů do stránky / používání formuláře jako součásti snippetu za časté (používané/praktické)? Ptám se z toho důvodu, jestli je tedy reinicializace formulářů/ajaxových odkazů žádoucí. Případně nějaké tipy ohledně toho, jak to udělat výkonově optimálně.

Editoval bojovyletoun (15. 5. 2011 14:01)

22
Člen | 1478
+
0
-

pořád to nechápu s tím die(), přece se mi naváže na každý element jen jednou, takže jak se mi může zvyšovat počet requestů? Já tedy používám livequery(), což nevím, jestli je teď ještě úplně nutné, když můžu spustit vlastní funkci přes trigger.
Můžeš mi sem hodit nějaký příklad, jak se geometricky zvyšuje počet requestů při použití live() třeba proo click event?

bojovyletoun
Člen | 667
+
0
-

já to live volám právě při každém xhr požadavku.
Je to vidět na jednoduchém příkladu, kdy kliknutí na ajaxový odkaz změní snippet s náhodným číslem. Po 5 kliknutích tam čísílka budou běhat samy :)

Prakticky si to můžeš vyzkoušet tak, že po každém kliknutím na odkaz do konzole zapíšeš tento kód
( předpokládám, že používáš https://componette.org/search/?…) – tento kus kódu je nazýván funkcí initSnippet

$("a.ajax").live("click", function (event) {
    event.preventDefault();

    $.get(this.href);

    // zobrazení spinneru a nastavení jeho pozice
    $("#ajax-spinner").show().css({
        position: "absolute",
        left: event.pageX + 20,
        top: event.pageY + 40
    });
});
22
Člen | 1478
+
0
-

nevím, dal jsem si do snippetu i ten link, aby se na něj pokažde nabindoval event, volám si nějaký handle a koukam do Firebugu a počet requestu je tolik, kolikrát kliknu, takže mi se nic nenásobi a žádné die() nevolám, což je podle mého názoru očekávané chování.

bojovyletoun
Člen | 667
+
0
-

Tak to nevím, co je příčina. K násobení požadavků docházelo, pokud byl odkaz mimo snippet (pokud by byl ve snippetu, tak se snippet nahradil novým lelementem a ke kumulaci by nedocházelo)

Editoval bojovyletoun (15. 5. 2011 15:00)

22
Člen | 1478
+
0
-

i tak se to chová stejně, jak říkám, prostě se to může nabindovat i přes live() pouze jednou na každý selector.

cuga
Člen | 210
+
0
-

neresil se tvuj problem tady: https://forum.nette.org/…-js-validaci ? az tak pozorne jsem cele vlakno necetl, ale mam z toho takovy pocit ;)