NITTRO – AJAX – ziskani dat vracenych serverem
- vylink
- Člen | 2
Ahoj,
na svem projektu pouzivam nittro. Nevite nekdo jak se dostanu k datum, ktere server vraci?
Neco jako je u jQuery ‚complete‘, nebo ‚success‘?
Potrebuji si navesit sluzbu, ktera mi po kazdem ajaxovem volani precte data z payload a dale je zpracuje.
Vzhledem k neexistujici dokumentaci jsem nasel jediny callback ‚request-created‘ tady na foru:
<script>
di.getService('ajax').on('request-created', function(evt) {
//funguje
});
</script>
Potreboval bych ale neco takoveho:
<script>
di.getService('ajax').on('completed', function(data) {
//tady bych rad precetl vse co se mi vraci ze serveru {snippets: [...], customdata: [...], atd...}
});
</script>
Pochopitelne se ale nebranim ani jine moznosti jak precist data vracene serverem napriklad s vyuzitim NITTRO snippetManageru, pokud to jde. Nize jeste kod ktery zkousim, ale nevraci to co potrebuji:
<script>
this.di.getService('snippetManager').on('after-update', (evt) => {
// evt.data obsahuje pouze info o snippetech {update: [snippet1, snippet2]}
// potreboval bych ale dostat vsechna data vracena serverem
});
</script>
Snad je pochopitelne o co mi jde…
Diky a pekny den.
- teekey99
- Člen | 45
<script>
...
di.getService('page').on('transaction-created', function (event) {
var transaction = event.data.shift();
transaction.on('ajax-response', function (transaction) {
// a tady máš k dispozici objekt transaction.data.response,
// obsahuje i nějaký kontextuální info o server response,
// payload najdeš v transaction.data.response._.payload
});
});
...
</script>
- jahudka
- Člen | 71
teekey99 napsal(a):
<script> ... di.getService('page').on('transaction-created', function (event) { var transaction = event.data.shift(); transaction.on('ajax-response', function (transaction) { // a tady máš k dispozici objekt transaction.data.response, // obsahuje i nějaký kontextuální info o server response, // payload najdeš v transaction.data.response._.payload }); }); ... </script>
event.data.shift()
by rozhodně nemělo fungovat –
event.data
je plain object, kterej by měl mít property
transaction
, takže správně by bylo
var transaction = evt.data.transaction;
. Jinak v eventu
ajax-response
dostaneš jako první argument opět instanci
události, nikoliv samotné transakce, takže proměnná
transaction
v handleru by se spíš opět měla jmenovat
event
nebo evt
. Přístup k vnitřním datům
response objektu přes ._.
je velká čuňárna – všechno co je
za podtržítkem je by convention private; obecně this._
se
v Nittru používá jako storage objekt pro privátní data (protože JS zatím
nemá ekvivalent PHPkovýho private $foo
) – takže
správnější by bylo použít evt.data.response.getPayload()
.
Ale pravda je, že dokumentace je v úděsným stavu, takže si nemůžu stěžovat :-)
- TomasHalasz
- Bronze Partner | 79
Ahoj, díky za nittro :-) a taky za info jak se dostat k datům
z payloadu.
Mám však potíž s kterou si nevím rady. Potřebuji získat přes handle,
jehož url mám ve finalUrl určitý stav záznamu a podle tohoto stavu pak
přidat class k prvkům formuláře. Zároveň chci zobrazit metodou z handle,
který volám také flashmessage.
Na blur input pole mám napojený následující script:
<script>
ab.href = finalUrl;
ab.setAttribute('data-history', 'false');
_context.invoke(function(di) {
di.getService('page').openLink(ab).then( function(){
});
di.getService('page').on('transaction-created', function (event) {
var transaction = event.data.transaction;
transaction.on('ajax-response', function (transaction) {
// a tady máš k dispozici objekt transaction.data.response,
// obsahuje i nějaký kontextuální info o server response,
// payload najdeš v transaction.data.response._.payload
$("#loading").hide();
console.log('jsme tu');
console.log(transaction.data.response._.payload);
obj = transaction.data.response._.payload.data;
if (obj.result == 1)
{
$('#frm-edit-rinv_number').addClass("alert-danger");
if ($('#frm-edit-price_e2_vat').length > 0)
{
$('#frm-edit-price_e2_vat').addClass("alert-danger");
}
$('#frm-edit-price_e2').addClass("alert-danger");
}else{
$('#frm-edit-rinv_number').removeClass("alert-danger");
if ($('#frm-edit-price_e2_vat').length > 0)
{
$('#frm-edit-price_e2_vat').removeClass("alert-danger");
}
$('#frm-edit-price_e2').removeClass("alert-danger");
}
});
});
});
</script>
V podstatě to funguje, ale problém je, že funkce:
transaction.on(‚ajax-response‘, function (transaction) {
se mi pak volá u každého ajax requestu, který nittro obsluhuje.
Určitě to mám blbě, ale nevím jak správně? Jde třeba Nittru říct,
že to co mám ve funkci:
transaction.on(‚ajax-response‘, function (transaction) {
se týká jen konkrétního input pole? Nebo nějak po dokončení zpracování
odebrat z nittra toto:
transaction.on(‚ajax-response‘, function (transaction) {
Doufám, že to popisuju aspoň trochu srozumitelně.
díky za každou radu
- jahudka
- Člen | 71
TomasHalasz napsal(a):
Ahoj, díky za nittro :-) a taky za info jak se dostat k datům z payloadu.
Mám však potíž s kterou si nevím rady. Potřebuji získat přes handle, jehož url mám ve finalUrl určitý stav záznamu a podle tohoto stavu pak přidat class k prvkům formuláře. Zároveň chci zobrazit metodou z handle, který volám také flashmessage.Na blur input pole mám napojený následující script:
<script> ab.href = finalUrl; ab.setAttribute('data-history', 'false'); _context.invoke(function(di) { di.getService('page').openLink(ab).then( function(){ }); di.getService('page').on('transaction-created', function (event) { var transaction = event.data.transaction; transaction.on('ajax-response', function (transaction) { // a tady máš k dispozici objekt transaction.data.response, // obsahuje i nějaký kontextuální info o server response, // payload najdeš v transaction.data.response._.payload $("#loading").hide(); console.log('jsme tu'); console.log(transaction.data.response._.payload); obj = transaction.data.response._.payload.data; if (obj.result == 1) { $('#frm-edit-rinv_number').addClass("alert-danger"); if ($('#frm-edit-price_e2_vat').length > 0) { $('#frm-edit-price_e2_vat').addClass("alert-danger"); } $('#frm-edit-price_e2').addClass("alert-danger"); }else{ $('#frm-edit-rinv_number').removeClass("alert-danger"); if ($('#frm-edit-price_e2_vat').length > 0) { $('#frm-edit-price_e2_vat').removeClass("alert-danger"); } $('#frm-edit-price_e2').removeClass("alert-danger"); } }); }); }); </script>
V podstatě to funguje, ale problém je, že funkce:
transaction.on(‚ajax-response‘, function (transaction) {se mi pak volá u každého ajax requestu, který nittro obsluhuje.
Určitě to mám blbě, ale nevím jak správně? Jde třeba Nittru říct, že to co mám ve funkci:
transaction.on(‚ajax-response‘, function (transaction) {
se týká jen konkrétního input pole? Nebo nějak po dokončení zpracování odebrat z nittra toto:
transaction.on(‚ajax-response‘, function (transaction) {Doufám, že to popisuju aspoň trochu srozumitelně.
díky za každou radu
Ahoj, jasně, jen místo metody .on()
použij
.one()
:-) konkrétně takhle:
<script>
// ...
di.getService('page').one('transaction-created', function (event) {
// ...
});
// ...
</script>
Editoval jahudka (7. 9. 2018 17:39)
- TomasHalasz
- Bronze Partner | 79
jahudka napsal(a):
Ahoj, jasně, jen místo metody.on()
použij.one()
:-) konkrétně takhle:<script> // ... di.getService('page').one('transaction-created', function (event) { // ... }); // ... </script>
Ano, to je přesně ono, díky!
Díval jsem se ještě do NittroEventEmitter a kromě on a one tam máš ještě first a off. First chápu, tak že bude vyvolán pouze poprvé. Off slouží k čemu a jak ho použít? Je to někde popsáno?
díky moc
- jahudka
- Člen | 71
Ahoj,
first()
je trochu jako one()
, ale je tam jeden
podstatnej rozdíl pokud navazuješ handler na víc eventů zároveň –
first()
naváže handler tak, že se spustí jen jednou při
prvním výskytu kteréhokoliv z eventů na které je navázaný, zatímco
one()
se spustí při prvním výskytu každého
z eventů, na které je navázaný. Třeba:
<script>
mujWidget.one('mouse-click key-press', function(evt) {
console.log('one(): ' + evt.type);
});
mujWidget.first('mouse-click key-press', function(evt) {
console.log('first(): ' + evt.type);
});
mujWidget.trigger('mouse-click');
mujWidget.trigger('key-press');
// v konzole bude:
// one(): mouse-click
// first(): mouse-click
// one(): key-press
</script>
off()
slouží k odvázání event listenerů, podobně jako
u jQuery. Příklady:
<script>
// zruší *všechny* posluchače události 'mouse-click'
mujWidget.off('mouse-click');
// zruší posluchače zaregistrované pomocí .on('mouse-click.muj-namespace', ...)
mujWidget.off('mouse-click.muj-namespace');
// zruší konkrétního posluchače mujHandler - pozor na to, aby
// byla skutečně předána reference na ten samý objekt / funkci
// jako při registraci - .on('mouse-click', mujHandler)
mujWidget.off('mouse-click', mujHandler);
// a samozřejmě to jde kombinovat:
mujWidget.off('mouse-click.muj-namespace', mujHandler);
// a pro cleanup je užitečná forma:
mujWidget.off(); // - odváže úplně všechny posluchače
</script>
Editoval jahudka (8. 9. 2018 17:19)
- TomasHalasz
- Bronze Partner | 79
Díky moc za vysvětlení. Nittro je skvělé a podle mě by si zasloužilo trošku podrobnější dokumentaci :-) Vím, že jsi plánoval něco napsat, a času je určitě pořád nedostatek. Kéž bych o nittru věděl víc a mohl pomoct …