The CreatorCon Call for Content is officially open! Get started here.

AngularJS retrieve data from include script

Filipe Coucello
Kilo Contributor

Greetings,

I'm developing an application following the Learning Plans from the developer.servicenow.com website.

I was just introduced to AngularJS application. I just finished the module Introduction to AngularJS in ServiceNow.

All worked like a charm.

Now I'm trying to get some information from the database by the UI script of the "Client-side logic for Angular App" so I added this piece of code.

$scope.getIncidents = function() {
    var ga = new GlideAjax("FCDevInstDBcontext");		
	ga.addParam('sysparam_name', 'getData');
	console.log(ga);
	ga.getXMLAnswer(function(answer) {
		console.log("Awnser: " + answer);
		alert(answer);
	});
};

And then I created a Script Include for my app:

var FCDevInstDBcontext = Class.create();
FCDevInstDBcontext.prototype = Object.extendsObject(global.AbstractAjaxProcessor, {
	getData: function() {
		gs.log(">-----------FCDevInstDBcontext-------------<");
		var records = [];
		var incidentsTbl = new GlideRecord('incident');
		incidentsTbl.query();
		while(incidentsTbl.next()) {
			records.push(incidentsTbl);			
		}
		gs.log(records);
		return records;
	},
});

It always returns null.

I found out that I can use GlideRecord on my angular UI Script using an asynchronous function, but that's not a good way to do it, calling it from the client side, Am I right?

Any help is appreciated.

Regards,

Filipe

1 ACCEPTED SOLUTION

To resolve this next issue instead of directly pushing each returned GlideRecord object into the array, a new object should be created and then pushed into the array. Then after that stringify the return and then encode/parse the callback response. 

For example in the script include:

getData: function() {
	gs.log(">-----------FCDevInstDBcontext-------------<");
	var records = [];
	var incidentsTbl = new GlideRecord('incident');
	incidentsTbl.query();
	while(incidentsTbl.next()) {
                var obj = {};
                obj.number = incidentsTbl.getValue('number');
                obj.description = incidentsTbl.getDisplayValue('description');
		records.push(obj);			
	}
	gs.log(records);
	return JSON.stringify(records);
}

Okay, that could be a pain to have to write out all the fields if you need all the fields returned. This could be an alternative:

getData: function() {
	gs.log(">-----------FCDevInstDBcontext-------------<");
	var records = [];
	var incidentsTbl = new GlideRecord('incident');
	incidentsTbl.query();
	while(incidentsTbl.next()) {
                var fields = Object.keys(incidentsTbl);
                var obj = {};
                fields.forEach(function assignValuesToObj(key){
                    obj[key] = incidentsTbl.getValue(key);
                    if(incidentsTbl[key].getDisplayValue())
                          obj[key + '_dv'] = incidentsTbl[key].getDisplayValue();
                });
                
		records.push(obj);			
	}
	
	return JSON.stringify(records);
}

Then in the glideAjax in the client script:

$scope.getIncidents = function() {
    var ga = new GlideAjax("FCDevInstDBcontext");		
	ga.addParam('sysparam_name', 'getData');
	//console.log(ga);
	ga.getXMLAnswer(function(answer) {
		console.log("Awnser: " + JSON.parse(answer));
		alert(answer); //not parsing the alert because it needs to be string here to display correctly in an alert
	});
};

View solution in original post

6 REPLIES 6

Ankur Bawiskar
Tera Patron
Tera Patron

Hi Filipe,

What log statements are printing?

Also what are you getting in console statements.

Regards

Ankur

Regards,
Ankur
Certified Technical Architect  ||  9x ServiceNow MVP  ||  ServiceNow Community Leader

Filipe Coucello
Kilo Contributor

On serverside logs nothing shows an error or even gs.log(">-----------FCDevInstDBcontext-------------<");

Looks like it never runs the include script.

 

https://ibb.co/kEBYjU

find_real_file.png

Stijn Verhulst3
Kilo Guru

Hi Filipe,

 

you have a small typo with severe consequences so it seems 😉

 

ga.addParam('sysparam_name', 'getData'); should be ga.addParam('sysparm_name', 'getData');

 

Stijn

Well that was helpful but it didn't solve the problem 🙂

 

https://ibb.co/fStfg9

find_real_file.png