Jak vyřešit chybu Uncaught TypeError: $.nette is undefined, která se může zobrazit v Nette projektu, když chceme použít AJAX?
Mějme např. tento kód:
$.nette.ajax(
{
url: $(this).attr('data-href'),
data: {variantId: $(this).attr('data-id')}
});
Který může vyvolat chybu níže.
Chyba
Uncaught TypeError: $.nette is undefined
Řešení
Je potřeba použít novější js knihovnu pro obsluhu snippetů - Naja.
npm install naja
AJAX požadavek pak bude vypadat třeba takto:
naja.makeRequest(
'POST',
$(this).attr('data-href'),
{variantId: $(this).attr('data-id'), amount: amount}
);
pouzivam nette naja ajax a mam zajimavy problem. Pokud jsou nejake polozky, tak se redraw normalne provadi a funguje to na jednicku jak je ocekavano.
Tzn. $this->redrawControl('products'); probehne.
Ale problem nastane, kdyz v danem snippetu je obsah a ja potrebuji prekreslit, ze tam zadny obsah nasledne byt nema. Tzn. mam napr. produkty, neco prefiltruju ajaxem a pak to zadne produkty nesplnuji a ja potrebuji ty predesle produkty odstranit.
Vyzkoumal jsem, ze v takovem ajax XHR pozadavku nejsou data pro tento snippet a tim padem se nic neprekresluje.
Opravdu nevim co s tim, poradite nekdo? Diky
už jsem se s tím setkal. Může to mít více příčin.
1.) Je potřeba udělat to, že i když tam žádné položky být nemají, tak tam stejně nějaký obsah poslat musíš, takže pokud posíláš do šablony třeba:
$this->template->products = null;
Tak tam raději pošli string 'null'
$this->template->products = 'null';
Pak udělej
$this->redrawControl('products');
Tzn. tímto zajistíš, že se nějaká dota do XHR požadavku pošlou (ověř si v XHR, že tam bude tvůj snippet vidět). V šabloně pak pochopitelně musíš udělat podmínku na 'null'.
2.) Nebo tam může být ještě druhotný problém s tím, že máš nad snippetem v šabloně nějaké podmínky přes které to neprojde a tím pádem se to nepřekreslí - takže to chce podmínky revidovat a pohrát si s nima.
Měj se
používám v Nette AJAX přes js Naja a mám problém, že když udělám toto:
document.addEventListener('DOMContentLoaded', function () {
naja.makeRequest('GET', {plink loadProducts!}, { 'home': 'loadProducts' }, { history: false });
naja.makeRequest('GET', {plink loadItems!}, { 'home': 'loadItems' }, { history: false });
});
tzn. když udělám dva naja requesty za sebou, tak se prove pouze ten poslední!
Vypadá to, že tam je patrně nějaký problém v paralelním běhu více requestů za sebou.
Když tam totiž dám mezi requesty timeout, tak se to provede, ale já tam timeout nechci.
A ještě mám problém s tím, že se mi někdy po redraw dostane do šablony do URl parametr s "&do=loadItems" přestože mám nastaveno history:false.
Co s tím? Díky moc
aby šlo používat Naja požadavky paralelně, tak tam musíš přidat "unique: false", takže takto:
document.addEventListener('DOMContentLoaded', function () {
naja.makeRequest('GET', {plink loadProducts!}, { 'home': 'loadProducts' }, { history: false, unique: false });
naja.makeRequest('GET', {plink loadItems!}, { 'home': 'loadItems' }, { history: false, unique: false });
});
Co se týče URL parametru - zkus změnit request z GET na POST - to by mohlo pomoci.