invalidace snippetu pomocí javascriptu
- Nich
- Člen | 49
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
Přenačtení strnánky == NO AJAX. Napiš, jaký obslužný skript používáš.
- Nich
- Člen | 49
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
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
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
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.
- bumprask
- Člen | 59
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
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.
- jiri.pudil
- Nette Blogger | 1032
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š.