我正在尝试在dojo中创建动态网格。基本上,我有一个选择表单和一个网格,当我选择一个选择选项时,我希望网格加载一个不同的数据集。
代码:
contentPane = new ContentPane({
title: "Group 1",
});
//Create grid
function genGrid(dataframe){
alert(dataframe);
myStore = Cache(JsonRest({target:"/data/"+dataframe}), Memory());
return grid = new DataGrid({
store: dataStore = ObjectStore({objectStore: myStore}),
structure:[{"field": "division", "name": "division", "width": "200px"}, {"field": "country", "name": "country", "width": "200px"}, {"field": "sales", "name": "sales", "width": "200px"}, {"field": "cost", "name": "cost", "width": "200px"}]},
"target-node-id").placeAt(contentPane.containerNode);};
sel = new Select({
name: 'select2',
onChange: function(select){alert(select);
genGrid(select)},
options: [
{ label: 'TN', value: 'Tennessee' },
{ label: 'VA', value: 'Virginia', selected: true },
{ label: 'WA', value: 'Washington' },
{ label: 'FL', value: 'Florida' },
{ label: 'CA', value: 'csvtable' }]
}).placeAt(contentPane.containerNode);
contentTabs.addChild(contentPane);
但是,此代码不起作用。如果我在sel onChange属性之外调用genGrid(dataframe),则会出现网格,但是当我在select中选择选项时它不会改变。
我怀疑这里的问题是我如何将网格和选择附加到contentpane,但我找不到更好的方法来做到这一点。
答案 0 :(得分:1)
1)dojo小部件需要一个DOM节点作为小部件的占位符。您的“target-node-id”是具有该ID的实际DOM元素吗?如果没有,网格将无法很好地呈现 填充网格时不需要任何placeAt调用 - dojo将使用datagrid替换具有id target-node-id的DOM元素。 如果您以编程方式执行所有操作,我建议使用id target-node-id执行document.createElement('div'),例如, 将它附加到html中的父节点,然后创建datagrid,指定target-node-id作为要替换的DOM节点
2)在select onChange事件处理程序中,您不需要创建新的数据网格。 您只需更新商店 - datagrid将自动更新(这是使用像dojo这样的工具包的好处) 根据您的用例,您甚至可以重复使用同一个商店,只需更改其中的数据即可 (如果它是itemfilereadstore,则在商店中设置clearonclose) 有关如何使用新数据重新填充网格的示例,请参阅Dojo - How to refresh combobox with updated ItemFileReadStore data