invalidace snippetu pomocí javascriptu

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

Zdravím, mám takový menší problém se snippetem, který invaliduji při odeslání formuláře.

	public function reloadFormSubmitted($form)
	{
	if (!$this->presenter->isAjax()) {
	$this->presenter->redirect('this');
	} else {
	$this->invalidateControl('reload');
	}
	}

při klasickém odeslání formuláře (kliknutí) všechno funguje jak má ⇒ snippet se přenačte, ale já bych potřeboval, aby se mi ten snippet reloadnul i při nějaké jiné akci uživatele a to přesněji zapomocí javascriptu.

Vyzkoušel jsem tohle:

var reloadButton = document.getElementById("frmreloadForm-send");
reloadButton.submit();

ale to mi způsobí přenačtení celé stránky, jako při klasickém odeslání bez ajaxu. A já potřebuji invalidovat jen ten snippet. Jde to nějak udělat?

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

Přenačtení strnánky == NO AJAX. Napiš, jaký obslužný skript používáš.

Nich
Člen | 49
+
0
-

no sem začátečník, tak sem šáhnul po ajax skriptu z quickstart tutorialu

jQuery.ajaxSetup({
    cache: false,
    dataType: 'json',
    success: function (payload) {
        if (payload.snippets) {
            for (var i in payload.snippets) {
                $('#' + i).html(payload.snippets[i]);
            }
        }
    }
});

// odesílání odkazů
$('a.ajax').live('click', function (event) {
    event.preventDefault();
    $.get(this.href);
});

// odesílání formulářů
$('form.ajax').live('submit', function (event) {
    event.preventDefault();
    $.post(this.action, $(this).serialize());
});
Vojtěch Dobeš
Gold Partner | 1316
+
0
-

Použij nette.ajax.js. Jinak tvým záměrem je přesně co? K neajaxovému odesílání dochází proto, že vyvoláváš událost submit na tlačítku, které ale zaajaxované není. Pokud použiješ nette.ajax.js, stačí tlačítku přidat CSS třídu ajax a vyvolat na něm událost click.

Nich
Člen | 49
+
0
-

No tak sem použil nette.ajax.js a metodu click na tlačítko, ale i tak se mi reloadne celá stránka ⇒ neajaxové odeslání. Já potřebuji, aby se mi po nějaké události uživatele na stránce, aktualizoval určitý snippet a stránka se celá nepřenačetla. Prostě javascriptem reloadnout jen jeden snippet a né celou stránku.

K tomu sem si chtěl udělat takovej skrytej formulář s jedním submit tlačítkem, kterej potom schovám před uživatelem. A tenhle formulář mi aktualizuje ten snippet. Bohužel pokud to odeslání provedu pomocí javascriptu, nepoužije se ajax a reloadne se celá stránka.

Doufám, že sem dostatečně vysvětlil o co mi jde :-)

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

Reloadnutí snippetu je jen jedna z možných reakcí na AJAXový požadavek. Tobě jde především o AJAXový požadavek, ten vůbec nemusí být na principu formuláře… může jít třeba o odkaz. V tomhle případě to bude jednodušší… a úplně nejčistší to bude takto:

$.nette.ajax({
	url: ... // $('#mySecretLink').attr('href') nebo natvrdo adresa...
});

a

<a id="mySecretLink" n:href="signal!" style="display:none"></a>

A v presenteru si udělat handleSignal a obsluhu provádět tam.

Ten Javascriptový kód pak můžeš hodit kdekoliv ho potřebuješ vyvolat – není provázaný s žádným UI událostmi.

Nich
Člen | 49
+
0
-

supr moc dík, už to funguje suprově :-)

bumprask
Člen | 59
+
0
-

Zde je tedy problém vyřešen událostí click nad elementem s odkazem na signál presenteru, ovšem je možné vyvolat invalidaci snippetu přímo javascriptovým kódem, tedy bez nutnosti obsluhy v presenteru?

Modelová situace:
V případě, že aplikace využívá jquery dialogy, či jiné pluginy a je potřeba aktualizovat konkrétní snippet po události, kterou vyvolá tento plugin. Např. při zavření okna dialogu aktualizovat obsah konkrétního snippetu (třeba seznamu kontaktů, jehož položky jsme v dialogu upravovali).

Editoval bumprask (2. 1. 2013 13:33)

jiri.pudil
Nette Blogger | 1032
+
0
-

Omyl. Zde je problém vyřešen odesláním AJAXového requestu na nějaký pomocný signál v presenteru. Jinak to ani udělat nejde.

Leda bys měl po zavření dialogu někde v JS k dispozici ta data z něj. V tom případě by sis mohl obsah inkriminovaného prvku překreslit ručně rovnou v JS.

bumprask
Člen | 59
+
0
-

Měl jsem na mysli to, že invalidaci snippetu způsobí click na daný element, ale spíše mi jde o spuštění invalidace snippetu jinou událostí než click, tedy například událostí close dialogového okna.

Editoval bumprask (2. 1. 2013 14:59)

jiri.pudil
Nette Blogger | 1032
+
0
-

Znovu a důkladně si přečti tenhle příspěvek. Invalidaci snippetu způsobí volání funkce $.nette.ajax. To si navěsíš na libovolnou událost, třeba zavření dialogového okna, a o zbytek se postará nette.ajax.js. Jako url té funkci předáš link na signál a v příslušné handle* metodě v presenteru si invaliduješ, co potřebuješ.