Vlastné dáta nette.ajax request

Aris
Člen | 48
+
0
-

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
+
+1
-

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)

Čamo
Člen | 786
+
0
-

@OndřejKubíček To by ale nemalo byť potrebné nie? Nette ajax sa vie o snippety postarať automaticky.

Aris
Člen | 48
+
0
-

Ď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
+
+1
-

@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
+
0
-

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
+
0
-

Nedalo mi to… v Chrome to nejde a Firefox, Firefox developer a Edge to berie :D

Čamo
Člen | 786
+
0
-

Ešte asi toto by bolo lepšie: url: $(this).attr('href') Odkay ti vygeneruje Nette. Neviem čo bolo to this.action…

Editoval Čamo (21. 6. 2018 18:51)

Aris
Člen | 48
+
0
-

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 | 786
+
0
-

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)