Ajax po druhé se neodešle
- lukas.jenicek
- Člen | 15
Dobrý den
měl bych dotaz ohledě ajaxu v templatu mám tenhle kód
<?php
var data = {};
$(document).on('submit', 'form.ajax', function (event){
Ajax.search
(
{link filterParcels!},
{"{!$control->name}-data": $(this).serialize()}, // data
function(){
}
);
event.preventDefault();
});
var Ajax = Ajax || (function(){
return {
search: function(link, data, callback) {
$.nette.ajax({
url: link,
data: data,
success: function(payload) {
typeof callback === 'function' && callback(payload);
}
});
}
};
}());
?>
a po odeslání hodnot ajaxem vše funguje, ale jakmile submitnu formulář
po druhé tak se neodesílá ajaxem. První ajax vrací normálně 200 OK a
vše je v pořádku.
Předem díky za jakoukoliv radu !
- lukas.jenicek
- Člen | 15
Tak jo zjistil jsem, že při první submitu to pošle na správný link, ale na druhym kliknutí se sice formulář posíla znovu ajaxem, ale uplně na jiný link a s jiným formátem DAT. Nejspíš je zatím určitá konfigurace $.nette.ajax, ale moc této knihovně nerozumím. Nemohl by někdo poradit ?
- Šaman
- Člen | 2659
AJAX is dark and full of terrors!
Rovnou varuju, že následující stať pravděpodobně nepřinese řešení tvého problému. Ale třeba tě potěší, že v tom nejsi sám :)
Myslel jsem, že mám stejný problém, poprvé v pohodě a napodruhé ajax
nefungoval. Pak jsem zjistil, že ajaxově resetuji Form včetně hidden pole,
které je potřeba pro správné zařazení záznamu. Takže to spadlo na dotazu
do databáze a „nefungovalo to“. To jsem opravil, ale stále mi ve výpisu
chyběl poslední přidaný záznam. Po jakémkoliv (i ajaxovém) refreši se
objevil, v databázi byl, ale při requestu, ve kterém se přidal, se mi při
následném redrawnutí neobjevil. Nakonec jsem zjistil, že redrawuji
v actionList($id), protože jsem potřeboval znát $id ještě před
vytvořením komponent. A protože neexistovala metoda renderList(), tak se mi
spustila action, nastavila $id, překreslila a teprve potom se mi
v továrničce vytvořila komponenta, která už samozřejmě obsahovala
i poslední záznam. Ta se ale už nevykreslila. Stačilo přidat prázdnou
renderList(), ani nebylo potřeba v ní redrawovat.
Ještě předtím jsem zjistil, že ajax nemá rád parametry komponent
render($param)
, ani pohledy komponent
{control foo:list}
. Ajax totiž při překreslování komponenty
zavolá prostě metodu render, bez parametru.
Proč to sem píšu, když to s tvým problémem asi moc nesouvisí? Protože AJAX is dark and full of terrors. Zkus to zjednodušit co nejvíc, zkus překreslovat snippety i s komponentama z presenteru (pokud ti nefunguje překreslování vnitřních snippetů komponent), zkus omezit parametry render metod, je pravděpodobnější, že problém je u tebe, než v knihovně, kterou už dlouho používá spousta lidí.
P.S. Jo a to jsem se vůbec nevrtal do vlastních skriptů, jen jsem přilinkoval nette.ajax.js a snažil se rozchodit poměrně základní funkcionalitu. Práce na dvě noci, ale už to šlape. :D
Editoval Šaman (24. 7. 2014 17:44)
- lukas.jenicek
- Člen | 15
Tak aspoň v tom nejsem sám :D .. Ten problém jsem vyřešil asi ne nejlepším způsobem nebo spíš s Nette dělám teprve asi měsíc a půl a posílal jsem takhle ajaxy pořád a asi na tom nic měnit nebudu … Udělal jsem to klasickým jquery bez NETTE.AJAX.JS.
<?php
// SEARCH FILTER FORM
$(document).on('submit', 'form.ajax', function(event){
data = $(this).serializeJSON();
Ajax.search
(
{link filterParcels!},
{"{!$control->name}-condition": data}, // data
function(payload){
$('#snippet-parcelsList-parcelsForm').html(payload.snippets['snippet-parcelsList-parcelsForm']);
}
);
event.preventDefault();
});
?>
Možná později přepíšu, ale potřeboval jsem to co nejrychleji napsat a když to funguje tak to asi ničemu nevadí.