NITTRO – AJAX – ziskani dat vracenych serverem

vylink
Člen | 2
+
0
-

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

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

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

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

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

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

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 …