我正在一个web应用程序上工作,我试图设置基于查询内置到ArcGIS地图服务的组合框。我设置了基于查询的第一个组合框,当我从中选择一个值时,我想查询一个ArcGIS地图服务来填充第二个。
出于测试目的,我将第一个组合框的值默认为一个选项,并且查询工作以填充第二个组合框。但是,当我更改第一个组合框时,我在为第二个组合框设置存储时出现错误。
请原谅代码的丑陋。我现在正在使它"工作",当我了解更多的时候会清理它。
function startCat(results) {
var items=[];
var features = results.features;
features.forEach(function(feature) {
cat = feature.attributes.CATEGORY;
items.push({name:cat});
});
var data = {
label: 'name',
items: items
};
var store = new ItemFileReadStore({data:data});
// create combobox
var comboBox = new ComboBox({
id: "catSelect",
name: "Category",
value: "LCC",
store: store,
onChange: changeCat,
}, "catSelect").startup();
// SUBCategory combo box fill with query
var subcatqueryTask = new QueryTask("http://sroarcgis.ducks.org/ducksunlimited/rest/services/WSITable/MapServer/4");
var subcatquery = new Query();
subcatquery.returnGeometry = false;
subcatquery.outFields = ["SUBCATEGORY"];
subcatquery.where = "CATEGORY = '" + dom.byId("catSelect").value + "'";
subcatqueryTask.execute(subcatquery, startSubCat);
}
function changeCat(){
// SUBCategory combo box fill with query
var subcatqueryTask = new QueryTask("http://sroarcgis.ducks.org/ducksunlimited/rest/services/WSITable/MapServer/4");
var subcatquery = new Query();
subcatquery.returnGeometry = false;
subcatquery.outFields = ["SUBCATEGORY"];
subcatquery.where = "CATEGORY = '" + dom.byId("catSelect").value + "'";
//domConstruct.destroy("subcatSelect");
subcatqueryTask.execute(subcatquery, startSubCat);
}
function changeSubCat(results) {
var items=[];
var features = results.features;
features.forEach(function(feature) {
cat = feature.attributes.SUBCATEGORY;
items.push({name:cat});
});
var data = {
label: 'name',
items: items
};
var store = new ItemFileReadStore({data:data});
var comboBox = dom.byId("subcatSelect");
comboBox.setStore(store);
}
我在startCat函数中创建第二个组合框用于测试目的。我想把它放在别的地方。
我一开始尝试以声明的方式创建类别组合框,但是我再次无法设置存储,除非我在创建该组合框时设置。
正如您将在代码中看到的,我试图销毁第二个组合框并重新创建它,但我总是收到subcatSelect已注册的错误。
最好的方法是什么?是否有一个适当的setStore方法,我还没有找到或正在破坏和重新创建组合框一个更好的方法来做到这一点?如果这是更好的方式,我怎么能摧毁它?
我很抱歉回答我自己的问题,但是经过两天的玩这个和写这个问题,我很快就明白了。
我修改了一个函数来设置存储。我不得不使用dom。
function changeSubCat(results) {
var items=[];
var features = results.features;
features.forEach(function(feature) {
cat = feature.attributes.SUBCATEGORY;
items.push({name:cat});
});
var data = {
label: 'name',
items: items
};
var store = new ItemFileReadStore({data:data});
node = registry.byId("subcatSelect");
node.setAttribute("store", store);
}