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 …