nette.ajax.js – alt. obsluha pro AJAX s jQuery
- sKopheK
- Člen | 207
Proč to z <a href="...">
dostane vždycky absolutní,
i když je tam relativní, a z <form action="...">
ne? Je
problém už v JavaScriptu?
Taky se mi formulář při manuálním odeslání z JavaScriptu
$(form).submit();
validuje dvakrát.
Lze nějak vypnout validace formuláře? V dokumentaci je uvedeno
rozšíření validation
, podle popisu je to však úplně něco
jiného.
Editoval sKopheK (2. 4. 2014 14:04)
- matopeto
- Člen | 395
Zdravim
Daju sa nejako predavat parametre rozsireniam? Ide mi o to urobit rozsirenie „uniq“ ktore nebude udrziavat globalne iba jeden ajax dotaz, ale pri volani si ajax otagovat a rozsirenie by udrziavalo jedno volanie pre kazdy tag. Pozeram do kodu a neviem ako by som to napisal. Nenapada to niekoho?
- Vojtěch Dobeš
- Gold Partner | 1316
@matopeto Rozšíření má jednak přístup
k elementu, který vyvolal request (pokud takový element byl), ze kterého si
lze třeba číst datové atributy, a taky má přístup k objektu
settings
, do kterého si jde při manuálním vyvolání requestu
předat cokoliv. Napsat takové rozšíření, jaké popisuješ, by neměl být
problém.
- matopeto
- Člen | 395
akadlec napsal(a):
zřejmě se snažíš použít nette.ajax.js k něčemu jinému než k čemu je určeno.
To si nemyslim, niektore requesty (ktorych nepotrebujem vediet odpoved) nech
si bezia i 20 naraz.
Niektore (napr. tie, ktore aktualizuju snippety) potrebujem aby bezal iba ten
posledny.
So standartnym unique to nefunuje lebo sa to pobije, nejde kombinovat ze
v niektorych je off: [uniqe] a inde nie, takze momentalne je to
bud/alebo :)
- matopeto
- Člen | 395
Keby niekto potreboval ten selectivny unique tak som to urobil takto:
https://gist.github.com/…peto/9936055
Je potrebne ale vypnut povodne uniqe rozsirenie.
Pouzitie:
<script>
$.nette.ajax({
uniqueTag: 'getComponentForm',
url: url,
data: {
componentId: componentId
}
});
</script>
Editoval matopeto (2. 4. 2014 17:12)
- mcmatak
- Člen | 504
jak řešíte násobné odeslání formuláře
dříve jsem to řešil dokud sem nepoužíval tuto knihovnu takto
<script>
$("#frm-editForm").on("submit", function (e) {
$(this).ajaxSubmit(e);
return false;
});
// je nutne pouzit live, protoze snippet prepise cely form a tim se ztrati vazba na nej! live zajisti ze i budouci formy se budou odkazovat na tuto fci
$("#frm-editForm :submit").on("click", function (e) {
$(this).ajaxSubmit(e, function(data, submittedBy, settings) {
</script>
funkce ajaxsubmit si pak formular zamkla na probihajici akci
napřílad
<script>
$('#frm-samplesForm-addsamplesbutton').trigger('click');
</script>
způsobí dvojité odeslání formuláře s nette.ajax
a jeste dodám ze pokud použiji
<script>
$('#frm-samplesForm-addsamplesbutton').trigger('submit');
</script>
tak to nerozpozná kterým tlačítkem sem form odeslal a tak nemůžu zpracovat odpověď
Editoval mcmatak (23. 4. 2014 11:05)
- akadlec
- Člen | 1326
Jak správně uděla vlastní nette.ajax call? Potřebuju vlastní before a success akci. Zkouším toto a nějak to nefunguje dle mých představ :(
$.nette.ajax({
validate: false,
before: function(){
// Hide waiting message
$(".submit-message", form).addClass("submitting");
},
success: function(){
// Hide waiting message
$(".submit-message", form).removeClass("submitting");
}
}, this, e);
before se mi nespustí a validace formu se provede taky dvakrát :(
- Oli
- Člen | 1215
Jak zjistím, který prvek (odkaz) spustil ajaxový požadavek? Potřeboval bych, když je ajax spuštěnej paginatorem aby vyscrolloval stránku nahoru, ale jinak ne. Teď mám tohle. To ale vyscrolluje pokaždý:
$.nette.ext('scrollTop', {
success: function (payload) {
$("html, body").animate({ scrollTop: 0 }, 500);
}
});
Zkoušel jsem tam různě dávat on click, ale bez výsledku…
- Vojtěch Dobeš
- Gold Partner | 1316
Všechny události
extenzí, které se vážou ke konkrétnímu requestu, dostávají jako
argument objekt settings
. Spouštějící element lze
najít zde:
function (payload, status, xhr, settings) {
var el = settings.nette.el;
}
- o5
- Člen | 416
Ahoj, jde nějak globálně vypnout inicializace validace formuláře? Možná jsem to jen přehlídnul, každopádně jsem našel jen „ruční“ způsob a to buď data atributem „data-ajax-validate“ nebo klíčem {validate: {form: false}}.
- Vojtěch Dobeš
- Gold Partner | 1316
Ono technicky vzato nic jako ajaxové odeslání formuláře neexistuje. Existuje ajaxový požadavek typu POST vyvolaný v závislosti na odeslání formuláře. A stejně tak uvažuje nette.ajax.js.
Pokud je formulář „zajaxován“, stačí na něm vyvolat událost submit. Alternativně lze zavolat $(‚form‘).netteAjax(e, options); .
- potapnik
- Člen | 127
Ahoj, pátrám, jak vyřešit následující problém: dynamicky si vytvářím prvky v JQuery, tj.
<script>
$(content).append(
$('<a/>', {
href: "signal!",
class: 'ajax'
})
);
</script>
A naivně jsem myslel, že stačí přidat třídu ajax, aby se mi updatnul snippet. (nepoužívám žádný extensions a nette.ajax.js používám nejvíc nejstandardnějc :-) – $.nette.init(); ). Pak mi došlo, že asi ne a původní konstrukci rozšířil, což nemělo naprosto žádný efekt :-) kód následuje. Chápu, že to dělám a chápu zřejmě úplně blbě, jinak by to přeci mělo fungovat :-)
<script>
$(content).append(
$('<a/>', {
href: "signal!",
class: 'ajax'
}).on('click', function (e) {
$.nette.ajax({}, this, e).done(function () {
alert('done');
})
})
);
</script>
- Michal Vyšinský
- Člen | 608
Řekl bych, že to má být takto:
$(content).append(
$('<a/>', {
href: "signal!",
class: 'ajax'
}).on('click', function (e) {
e.preventDefault(); //neodesílat odkaz klasicky
$.nette.ajax(this.href, this, e).done(function () {
alert('done');
})
})
);
A možná by bylo nejlepší navázat event na společného předka (čili asi content). To samozřejmě mimo append:
$(content).on('click', '.ajax', function(e){
$.nette.ajax(this.href, this, e).done(function () {
alert('done');
})
});
$(content).append($('<a/>', {
href: "signal!",
class: 'ajax'
}));
Editoval Michal Vyšinský (16. 6. 2014 16:51)
- potapnik
- Člen | 127
Díky moc, každopádně pes byl zakopaný tam, že celá proměnná content je předávána jako obsah infowindow, který zobrazuje Google Maps Javascript API. A to to dělá programově, takže řešením bylo přihodit eventListener na DOM ready toho infowindow a do něj vložit zhruba následující (za tu část kódu každopádně díky):
<script>
google.maps.event.addDomListener(dialog, 'domready', function() {
$('#map-infowindow').on('click', '.ajax', function(e) {
$.nette.ajax(this.href, this, e);
return false;
});
});
</script>
- Kurtas
- Člen | 109
@vojtech.dobes Muzu se prosim zeptat jak je to s history.ajax.js a chybou v NS_ERROR_ILLEGAL_VALUE pushState()?
Resenim je teda u parametru UI plnit prazdne pole? viz predesla stranka
Diky
Edit: Tak to je sice reseni ze to nepada, ale pak nefunguje tlacitko Back – resp se meni jen URL v adres baru nemeji se obsah stranky. Co tam pouzit nejakou kompresi?
Editoval Kurtas (23. 6. 2014 13:30)
- besir
- Člen | 170
Z tohodleby IMHO nebylo špatné udělat příklad ke komponentě ;-)
Michal Vyšinský napsal(a):
Řekl bych, že to má být takto:
$(content).append( $('<a/>', { href: "signal!", class: 'ajax' }).on('click', function (e) { e.preventDefault(); //neodesílat odkaz klasicky $.nette.ajax(this.href, this, e).done(function () { alert('done'); }) }) );
A možná by bylo nejlepší navázat event na společného předka (čili asi content). To samozřejmě mimo append:
$(content).on('click', '.ajax', function(e){ $.nette.ajax(this.href, this, e).done(function () { alert('done'); }) }); $(content).append($('<a/>', { href: "signal!", class: 'ajax' }));
- Vojtěch Dobeš
- Gold Partner | 1316
<div n:snippet="foo" data-super-effect>
...
</div>
var originalApplySnippet = $.nette.ext('snippets').applySnippet;
$.nette.ext('snippets').applySnippet = function ($el, html) {
if ($el.is('[data-super-effect]')) {
$el.fadeTo('fast', 0.01, function () {
$el.html(html).fadeTo('fast', 1);
});
} else {
originalApplySnippet($el, html);
}
};
- Climber007
- Člen | 105
Používám jednoduchý skriptík na refresh a přepočítání hodnot vložených do formuláře:
$.nette.ext('onchange', {
load: function () {
$('input, .quantity button').on('change input click', function () {
$('button[name=recalculate]').click();
});
}
});
Problém je, že se s provedenými akcemi (change input click) hromadí identické requesty, které jsou vzápětí storovány resp. na ně nepřichází odpověď. Vždy co akce to jeden ihned stornovaný request navíc. Po těch nepovedených se nakonec jeden úspěšně provede. Čím to může být?
Editoval Climber007 (30. 7. 2014 1:23)
- Climber007
- Člen | 105
To je samozřejmě správně. Mně jde o to, proč se tam ty requesty vůbec vytvoří a hromadí, když provedu pouze jednu akci.
Editoval Climber007 (30. 7. 2014 8:37)
- Vojtěch Dobeš
- Gold Partner | 1316
@Climber007 To myslim nelze z uvedeneho kodu urcit. Neregistrujes
ajaxove pozadavky jeste nekde jinde nez skrze volani
$.nette.init()
?
- Climber007
- Člen | 105
Vůbec. Jednou kdesi na začátku mám $.nette.init()
a potom
jen toto. Bohužel čím víc požadavků obsloužím (a tím pádem je
šíleně moc těch nedoběhnutých) tím jsou další pomalejší.
Šla by má obsluha submitu formuláře udělat jinak, abych mohl vyloučit nebo lépe lokalizovat chybu/problém? Stačí něco primitivního a může to být na klasický submit.
Solved: Už vím kde je problém. Měl jsem celý formulář
.ajax
+ jsem vytvářel requesty tím $.nette.ext()
takže se to kdo ví jak duplikovalo a množilo.
Editoval Climber007 (30. 7. 2014 22:11)
- Climber007
- Člen | 105
Kolik můžu mít $.nette.ext(…)
na jedná stránce? Chtěl
bych více různých ptákovin (spinnery, animace,…) navázaných na axajový
požadavek, podle toho, který to byl, ale nechápu jak propojit to extension
k danému elementu (pro ajax nad formulářem bude jiný extension jako na ajax
nad tlačítkem kdesi jinde na stránce).
- akadlec
- Člen | 1326
@Climber007:
- Tak řek bych že je asi jedno kolik ext tam bude, jen to chce s rozvahou abys nezasekal paměť prohlížeče.
- To co chceš ty není v nette.ajax.js přímo. Taky jsem to chtěl a nakonec jsem se dopracoval společně s @vojtech.dobes k závěru kdy se ty ext. přidávají podle elementu. Mám to cca nějak takto:
Pomocí této funkce provedu podmíněnou registraci ext. Při vytvoření requestu se ověří zda element který jej vyvolal obsauje data atributu data-ajax-on a je v něm uveden název ext. Pokud tomu tak není tak se ext z requestu vyřadí.
/**
* Conditional including of extensions
*
* @param string name
* @param object events
* @param object context
*/
function addConditionalExtension(name, events, context) {
$.nette.ext(name, $.extend(events, {
prepare: function (settings) {
var ajaxOn = settings.nette.el.data('ajax-on');
if ( !settings.nette || !ajaxOn instanceof Array || $.inArray(name, ajaxOn) < 0 ) {
if ( !settings.off ) {
settings.off = [];
}
settings.off.push(name);
}
}
}), context)
}
No a pak jednotlivé ext přidávám pomocí té funkce:
/**
* Avatar upload
*/
addConditionalExtension('avatarUpload', {
init: function() {
//....
},
success: function (payload, status, xhr, settings) {
//....
}
});
Editoval akadlec (31. 7. 2014 9:23)
- Climber007
- Člen | 105
Super, díky moc. Princip chápu, ale není mi jasný, co zajišťuje, že
když zmáčknu na talčítko Upload
bude aktuální jen ten jeden
extension, který se má zrovna použít, nebude jich tam víc a nebudou spolu
kolidovat?
- akadlec
- Člen | 1326
@Climber007: to ti právě zajistí ten data atribut:
<a href="?do-totok" class="ajax" data-ajax-on="['nazevExt1', 'nazevExt2',...]">Upload</a>
a protože ty ext jsou připojeny podmíněně, tak předtím než se požadavek odešle se provede kontrola zda je možné danou ext použít. Co dělá ta funkce addConditionalExtension je to že ti to jednoduše registruje extension ale přidává tam ještě navíc metodu prepare která právě zajistí to že se daná ext použije jen tehdy když má.
- Climber007
- Člen | 105
Přišel jsem na to, že mi karta s aplikací zabírá po delší době i stovky MB v paměti. POtom jsem zjistil, že to dělá pouze tato část extension:
load: function () {
spinner = $('<div></div>', { id: "ajax-spinner"});
spinner.html('<div><i class="fa fa-spinner fa-spin"></i></div>');
spinner.appendTo(".suma");
$('button[name=recalculate]').css({
display: 'none'
});
}
Kam by bylo vhodné tohle přesunou, aby aplikace pořád nekynula? Rád bych
to dal pod init
, ale tam se to provede jen jednou (překreslí se
mi ta část, ke které se to připojuje), a při dalším requestu už se to
nezavolá. Jaký je tedy ještě rozdíl mezi init
a
load
?
Editoval Climber007 (1. 8. 2014 23:03)
- zapp
- Člen | 32
Zdravím,
asi mi uniká nějaká maličkost, ale nefungují mě žádné eventy
v rozšířeních, jen event load.
Takže například tento kód neudělá vůbec nic. Cílem je inicializovat znovu tinymce po invalidaci snippetu ve kterém je textarea, na které je tinymce navěšeno.
<script>
$.nette.ext('tinyMCEinit', {
success: function () {
alert("v");
}
});
</script>
Nemá někdo ponětí co dělám špatně? Používám jquery 1.8.3, ale zkoušel jsem i 1.7, jak je doporučeno a žádná změna.
- zimmi
- Člen | 94
Nazdárek,
mám následující problém:
V JS mám tlačítko generované knihovnou pro Leaflet. To je definované v .js souboru spolu se svým
chováním. Po použití akce, která je na něj navěšená, potřebuju zavolat
handle komponenty, a nevím, jak co nejlépe dostat do toho requestu URL.
Jediné, co mě dosud napadlo (a funguje, ale prostě mi to přijde jak
škrábání levou nohou za pravým uchem), je v šabloně
komponenty tohle:
<script>
var url = {link Click!};
</script>
A v .js souboru pak po události zavolat:
$.nette.ajax({
type: 'get',
url: url,
data: {
'y': 2,
'x': 2
}
});
Nedá se to udělat nějak elegantněji?
- Vojtěch Dobeš
- Gold Partner | 1316
@zimmi Nic lepšího asi moc vymyslet nelze. Akorát bych si to url předával v nějakém datovém atributu, ne přímo skrz vygenerovaný inline javascript.
- Vojtěch Dobeš
- Gold Partner | 1316
Otázka pro všechny: měly by být extensions z repositáře zařazeny do Bower balíčku? Aktuálně v něm nejsou přítomny.
- libik
- Člen | 96
Mam problem s validaci formulare, viz https://forum.nette.org/…eho-tlacitka#…
Aktualizoval jsem nette.ajax.js, verze co jsem mel predtim (velikost 136360b) ok, verze s velikosti 14668 stahnuta 11.9. mi zpusobuje problem popsany v postu vyse.
- LeonardoCA
- Člen | 296
bower + grunt ted 3. den ucim, aby pochopili co po nich chci a ted se dostalo na nette.ajax.js
@Oli: kdyz se podivas do repozitare v1.2.2 – neni v ni bower.json – proto:
- bower nenalezne konfiguraci „main“ a misto definovanych souboru presouva do dist adresare vsechno
- a protoze chybi bower.json, tak s tim jakekoli nastroje, ktere na bower.json stavi neumi pracovat, v bower_components se sice vygeneruje .bower.json, ale bez sekce „main“ … (neni „.bower.json“ jako „bower.json“)
a ja porad, proc mi wiredep pise, ze neumi nette.ajax.js pridat do zdrojaku a ze si ho tam mam dat sam :( (zatim dam do zavislosti pro muj testovaci projekt „master“ – tak ne, tam jsou zase extensions v ignore …)
@vojtech.dobes
- dal bych do main i vsechny extension, rekl bych, ze pro prvotni vytvoreni projektu a automaticky wiring js to bude prijemnejsi a kdo bude chtit vlastni konfiguraci, si to stejne casem nakonfiguruje po svem, treba pres „exportsOverride“
- zatim jeste nemam uplne vse vyzkousene, ale zda se, ze s teckami v nazvu souboru a/nebo pluginu maji grunt/bower/a pluginy (dost casto) problemy (mozna to souvisi s vyznamem „.“ v regularnich vyrazech)
Editoval LeonardoCA (6. 10. 2014 22:13)
- JakubTN
- Bronze Partner | 49
Ahojte,
chcel by som sa poradit, ako co najlepsie vyriesit zapinanie/vypinanie data-ajax-append pri snippete podla toho, ktorym linkom bol ajaxovy request vyvolany.
Priklad:
<div n:snippet="products" data-ajax-append="true">
...
</div>
<a n:href="loadMore!" class="ajax">viac</a>
<a n:href="filter!" class="ajax">filtruj</a>
Po kliknuti na link „viac“ by sa mali data v snippete appendovat, po kliknuti na „filtruj“ by sa mal snippet prekreslit cely bez appendu.
Dakujem za radu.
- akadlec
- Člen | 1326
Dá se nějak v samotném ajax callu zavolat spuštění extension? Mám totiž podmíněné extension které přidávám přes zde zmíněné addConditionalExtension no a pak mám klasický ajax call
$.nette.ajax({
});
no a dá se nějak v success metodě zavolat ta extension? Když by to byl klasický odkaz s ajaxifikací tak je to ok, tam mě to určí data atribut ale tady si nějak nevím rady.