I was looking at this post by Kelly Hutchins a programmatic way to populate a combo box. I have this web service: Layer: Sign (ID: 0) and I want to populate the items from the MUTCD field; there are over 257 items in the list. How would I change this code to work as AMD and what required statements do I need; I also want the first value to be "" and display as Select One :
function init() { queryTask = new esri.tasks.QueryTask ("http://sampleserver1.arcgisonline.com/ArcGIS/rest/services/Louisville/LOJIC_LandRecords_Louisville/M..."); query = new esri.tasks.Query(); query.returnGeometry = false; query.outFields = ["ZONING_TYPE"]; query.where = "ZONING_TYPE<> ''"; queryTask.execute(query,populateList); }
function populateList(results) { //Populate the ComboBox with unique values var zone; var values = []; var testVals={}; //Add option to display all zoning types to the ComboBox values.push({name:"ALL"}) //Loop through the QueryTask results and populate an array //with the unique values var features = results.features; dojo.forEach (features, function(feature) { zone = feature.attributes.ZONING_TYPE; if (!testVals[zone]) { testVals[zone] = true; values.push({name:zone}); } }); //Create a ItemFileReadStore and use it for the //ComboBox's data source var dataItems = { identifier: 'name', label: 'name', items: values }; var store = new dojo.data.ItemFileReadStore({data:dataItems}); dijit.byId("mySelect").store = store; } dojo.addOnLoad(init);
That's a really old blog post and there are new options for getting distinct values from a service. Take a look at returnDistinctValues on Query for one option.
Here's a code sample that uses it:
var query = new Query(); query.where = "SUB_REGION IS NOT NULL"; query.returnGeometry = false; query.outFields = ["SUB_REGION"] query.returnDistinctValues = true; layer.queryFeatures(query, function(results){ array.forEach(results.features, function(feature){ console.log(feature.attributes["SUB_REGION"]); }); });
Just to be sure, does this return the values that the user selects or the entered values?
I ended up entering the following:
/* Query Begin */ var query = new esriQuery("http://maps.decaturil.gov/arcgis/rest/services/test/StreetSignTest/FeatureServer/0"); query.where = "CONDITION_ IS NOT NULL"; query.returnGeometry = false; query.outFields = ["CONDITION_"] query.returnDistinctValues = true; layer.queryFeatures(query, function (results) { array.forEach(results.features, function (feature) { console.log(feature.attributes["CONDITION_"]); }); }); /* Query End */
I used esriQuery because dojo/query was in the require statement and already used a variable name query
and here is the latest code: csergent45/streetSigns · GitHub
Kelly Hutchins I updated my code to the following. Your code was working but it was providing me with a unique list of values entered. I wanted the coded values that were available for entry for the web service: I was using this page: FeatureLayer | API Reference | ArcGIS API for JavaScript
/* Query Begin */ var query = new esriQuery(); var queryBacking = new queryTask("http://maps.decaturil.gov/arcgis/rest/services/test/StreetSignTest/FeatureServer/0"); query.where = "1=1"; query.returnGeometry = false; query.outFields = ["BACKING"]; query.returnDistinctValues = true; queryBacking.execute(query, function (results) { array.forEach(results.features.getDomain("BACKING"), function (feature) { console.log(feature.getDomain["BACKING"]); }); //for (var i = 0; i < results.CodedValues.length; i++) { // console.log(results.CodedValues); //} }); /* Query End */
I'm getting this error:
"TypeError: results.features.getDomain is not a function
I also tried this, but it was undefined: console.log(app.signLayer.getDomain("BACKING").value);
How should I use getDomain to get the list of values?
This question was answered through Esri support. To obtain the coded values to populate a dropdown list, you enter the following code. I included an additional line so that no option would appear to be selected when a dropdown first appears.
//get the domain value var domain = app.signLayer.getDomain("BACKING"); //get the html select by ID var select = document.getElementById("backing"); //clear the current options in select for (var option in select) { select.remove(option); } var opt = document.createElement('option'); opt.innerHTML = ""; select.appendChild(opt); //loop through the domain value to fill the drop down for (var i = 0; i < domain.codedValues.length; i++) { console.log(domain.codedValues.name); ;var opt = document.createElement('option'); opt.innerHTML = domain.codedValues.name; opt.value = domain.codedValues.name; select.appendChild(opt); }
To go a little further with this, you could create a function with arguments like so:
function populateSelect(x, y) { //get the domain value var domain = app.signLayer.getDomain(x); //get the html select by ID var select = document.getElementById(y); //clear the current options in select for (var option in select) { select.remove(option); } var opt = document.createElement('option'); opt.innerHTML = ""; select.appendChild(opt); //loop through the domain value to fill the drop down for (var i = 0; i < domain.codedValues.length; i++) { console.log(domain.codedValues.name); ; var opt = document.createElement('option'); opt.innerHTML = domain.codedValues.name; opt.value = domain.codedValues.name; select.appendChild(opt); } }
And then for each dropdown that you want to populate, you could enter this line of code and replace the values for each line.
populateSelect("BACKING", "backing");
This will save you around 15 lines of code for each dropdown list that you want to populate.