Nette AJAX - Uncaught TypeError: $.nette is undefined

Nette AJAX - Uncaught TypeError: $.nette is undefined

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}
        );

Jak se ti článek líbil?

Komentáře (4)

Soptík
Ahoj,

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
Hanz
Ahoj,

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
Sputnik
Ahoj,

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
Hanz
Ahoj,

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.

Přidat komentář