nette.ajax.js – alt. obsluha pro AJAX s jQuery

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

A v čem je to problém :) ?

sKopheK
Člen | 207
+
0
-

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

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?

akadlec
Člen | 1326
+
0
-

zřejmě se snažíš použít nette.ajax.js k něčemu jinému než k čemu je určeno.

sKopheK
Člen | 207
+
0
-

Ještě k té dvojité validaci – jednou to tam vleze přes nette.ajax.js, ale podruhé už čistě přes netteForms, tak že by byl problém tam?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-

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

Vdaka vyskusam.

Inac je nejaky dvovod, preco sa pri tahani cez bower ingoruje folder extension? Rozsirenia i bower chcem pouzivat preto mi to nedava zmysel, aby som ich „rucne“ stahoval extra.

matopeto
Člen | 395
+
0
-

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

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

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

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

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

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;
}
Oli
Člen | 1215
+
0
-

Super díky funguje. Jen dodám, že mě to šlo s nejnovější verzí z masteru. S verzí 2.2 mě to nešlo, ale měl jsem tam kvůli grido nějaký změny, tak nevím jetli to nemohlo bejt i tím…

jannemec
Člen | 78
+
0
-

Formulář v dialogu – zdravím formulář s class=„ajax“ funguje bez problému, ale pokud ho mám v dialogu (jquery ui) nahraný ze serveru, proběhne bez ajax ovladače … lze po nahrání html do dialogového okna aktivovat ajax i pro tento „aktivní“ formulář?
Děkuji
JN

iguana007
Člen | 970
+
0
-

@jannemec – na předchozí stránce tohoto vlákna se to řešilo

o5
Člen | 416
+
0
-

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}}.

bazo
Člen | 620
+
0
-

ahoj, je mozne nejak programaticky odoslat form ajaxovo?

kedysi som pouzival $(‚form‘).ajaxSubmit();

v nette.ajax.js som nic take nenasiel, ale kedze pri clicku na submit button odosiela formy ajaxovo, mohol by toto api poskytnut aj pre iny kod

Vojtěch Dobeš
Gold Partner | 1316
+
+1
-

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

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

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

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

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

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'
}));
Lopo
Člen | 277
+
0
-

Niekto nejaky napad, preco mi nechce fungovat confirm extensia ?
Pri kliknuti na odkaz sa zavola prislusna before obsluha, ale nedostane settings.nette a tym padom hned skonci …
Takze bez opytania mi odmaze polozku :(

JuniorJR
Člen | 181
+
0
-

vojtech.dobes napsal(a):

@motorcb This way :)

$.nette.ext('snippets').applySnippet = function ($el, html) {
	$el.fadeTo("fast", 0.01, function () {
		$el.html(html).fadeTo("fast", 1);
	});
};

Jakym vhodnym zpusobem je mozne prizpusobit vlastni efekt pouze pro nektere snippety?

Vojtěch Dobeš
Gold Partner | 1316
+
0
-
<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);
	}
};
JuniorJR
Člen | 181
+
0
-

@vojtech.dobes Diky, presne timto zpusobem jsem to chtel resit. Jen jsem se chtel ujistit, jestli neexistuje neco na zpusob „jednorazoveho“ pouziti :)

Climber007
Člen | 105
+
0
-

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)

akadlec
Člen | 1326
+
0
-

Pokud spustíš request a v zápětí, než doběhne, spustíš další tak se ti ten první samozřejmě abortuje a odpálí se ten nový. Abys ten první nezrušil tak si to musíš zakázat extension „unique“ např.:

<a n:href="do!" class="ajax" data-ajax-off="unique">
Climber007
Člen | 105
+
0
-

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

@Climber007 To myslim nelze z uvedeneho kodu urcit. Neregistrujes ajaxove pozadavky jeste nekde jinde nez skrze volani $.nette.init()?

Climber007
Člen | 105
+
0
-

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

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

@Climber007:

  1. Tak řek bych že je asi jedno kolik ext tam bude, jen to chce s rozvahou abys nezasekal paměť prohlížeče.
  2. 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
+
0
-

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

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

Díky, už to chápu. Skvělá práce!

Climber007
Člen | 105
+
0
-

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

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

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

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

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.

Oli
Člen | 1215
+
0
-

@vojtech.dobes zajímavé, stáhnul jsem bower pomocí:

{
	// ...
	"dependencies": {
    	"nette.ajax.js": "~1.2.2"
  	}
}

a extensions v nem jsou. Nebo jsem něco přehlídnul?

libik
Člen | 96
+
0
-

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

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

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.

Quinix
Člen | 108
+
+1
-

@JakubTN obal stávající snippet ještě jedním. Při filter! invaliduj ten vnější, při loadMode! vnitřní.

JakubTN
Bronze Partner | 49
+
0
-

@Quinix Jo funguje :) Take lahke riesenie mi nenapadlo, dakujem.

akadlec
Člen | 1326
+
0
-

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.