Vlastné dáta nette.ajax request
- Aris
- Člen | 48
Ahoj, snažím sa o ajaxové prekreslenie mapy. Mám forumulár, v ktorom užívateľ zadá adresu a ajaxovo potrebujem tieto dáta odoslať (bez submitu) do presenteru, ktorý už zabezpečí potrebné súradnice pre mapu. Po dlhšom skúmaní som našiel chybu. Po redrawnutí snippetu boli vrátené potrebné hodnoty v snippete, avšak sa nevedel prekresliť.
Fígel je v tom, ako vytiahnuť bez odoslania formulára adresu, ktorá bude odoslaná AJAX-om.
<a class=" btn btn-info" id="map-update-btn" href="{plink updateMap!}">Aktualizovanie polohy</a>
<script>
$(function () {
$('#map-update-btn').on('click', function (event) {
var street = $("#frm-companyData-street").val();
var street_num = $("#frm-companyData-housenumber").val();
var village = $("#frm-companyData-village").val();
var postalcode = $("#frm-companyData-postalcode").val();
$.nette.ajax({
method: "POST",
url: this.action,
data: {'street' : street,
'street_num' :street_num,
'village' : village,
'postalCode' : postalcode
},
dataType: 'json'
});
event.preventDefault();
});
});
</script>
Request sa s dátami odošle, server pošle požadovaný response ale neprekreslí sa. Ak pridám odkazu triedu AJAX, odošle sa defaultný AJAX request s prázdnymi headermi a snippet sa prekreslí bez problémov. Jediný rozdiel je v metóde – defaultné pre nette.ajax zašle GET a vyššie uvedený javascript POST.
Viete ma prosím trošku nakopnúť, ako mať pri tlačidle nastavenú triedu AJAX, ale prepísať request na vyššie uvedený? Podľa toho čo som našiel, som myslel že stačí zavolať $.nette.ajax({…}) a vyplniť telo.
Ďakujem za pomoc :)
- Ondřej Kubíček
- Člen | 494
asi si to budeš muset v onSuccesu obnovit sám:
$.nette.ajax({
method: "POST",
url: this.action,
data: {'street' : street,
'street_num' :street_num,
'village' : village,
'postalCode' : postalcode
},
dataType: 'json',
success: function (payload) {
var $snippets = $.nette.ext('snippets');
$snippets.updateSnippets(payload.snippets);
}
});
Editoval Ondřej Kubíček (21. 6. 2018 16:44)
- Aris
- Člen | 48
Ďakujem páni, obaja máte mali pravdu :) Podarilo sa to sprevádzkovať, už ma štve len posunutie elementu s rovnakov výškou pri redrawe. Ono nešlo najprv ani riešenie, ktoré napísal @OndřejKubíček , tak som pozeral ešte do dokumentácie, na Stackoverflow a stále negatívny výsledok. Vrátil som sa nakoniec k pôvodnému riešeniu, ktoré nefungovalo pred pridaním príspevku. Rozdiel od pridaného bol v url.
<script>
url: window.location + '?do=updateMap'
</script>
Ďakujem Vám obom, opäť rozumiem AJAX-u o niečo lepšie :)
- Ondřej Kubíček
- Člen | 494
@Aris
počkej, takže jsi měl špatnou url adresu a chyběl ti tam handle updateMap?
:D a jak jsi jako čekoval ten response? to ses nepodíval, jestli ti to
vrátilo ten pozměněný snippet? tak to je pak jasné, tam to žádný snippet
nevrátilo, proto se ti to nepřekreslilo, ale to jsem ti ani nepsal, protože
jsi v prvním příspěvku psal, že server vrátil požadovaný response,
takže nevrátil v tom případě :D lol :D
- Aris
- Člen | 48
Exaktne to tak vyzerá, začínam sa hanbiť :D Pri debugu som vždy v Tracy
pozoroval updateMap! handle a až teraz som si všimol, že ma hádže na render
:D
Najkomickejšie je to, že som strávil najmenej celý deň s checkovaním
všetkých requestov s handle updateMap a jednoducho som na nič
neprišiel(ešte s updateMap!) :D
Vždy mi totižto vrátilo pozmenený snippet, ale nie a nie prekresliť,
skúšal som i kúsky s inicializáciou, ajax bez nette a stále nič :D
Necelú hodinu pred napísaním príspevku som skúšal čo to dalo, tak sa
pritrafila tá url a response som si asi ešte pamätal že vracalo dobrú.
- Aris
- Člen | 48
Máš pravdu, je to krajšie riešenie z pohľadu php :) Myslím však, že to funguje ale iba pri inline kóde napísanom v latte šablóne, alebo i v .js súbore? This.action je v prepise $( ‚#map-update-btn‘ ).attr( ‚action‘ ), teda by mal vrátiť aktuálnu akciu ak by som ju v php nastavil :) Keď už sme pri tejto téme, používate obyčajne <script> tagy v miestach šablóny kde sú potrebné, alebo to riešite klasicky js súbormi? Ja som naučený písať všetko do js súborov a ak by sa to zbytočne skomplikovalo, volím <script> priamo v šablóne s podobným použitím vlastností presentera/template ako si uviedol.
- Čamo
- Člen | 798
Na to ti každý odpovie inak. Script v latte šablone sa dá skombinovať s php a máš v nej prístup k php premenným. A celý kod je na jednom mieste takže ho nemusíš hľadať po celej aplikácii. Preto to uprednostňujem. Ale teda iba v situáciách ktoré sú špecifické pre danú šablonu. Javascripty ktoré sú platné pre celú aplikáciu sú ako js súbory.
Editoval Čamo (21. 6. 2018 20:46)