我创建dojox.grid.datagrid并从示例last example on page填充数组中的内容。在一段时间内,我在代码中更改该数组的值。如何刷新该网格的内容?如何从更改的数组中加载新数据?
答案 0 :(得分:22)
要更改网格中的值,您需要更改网格存储中的值。网格数据绑定到商店数据,网格将根据需要自行更新。
所以关键是要了解Dojo的数据api以及商店如何在Dojo中运行。而不是直接在网格中操作数据,而是在商店中对其进行操作。
理想情况下,商店是您在应用程序运行时操作的数组,您不需要将数组同步到网格。只需使用ItemFileWriteStore作为数据持有者,除非那是不可能的。
此外,如果可能的话,使用dojo数据标识api可以非常简单地在网格中查找项目。假设您知道应用程序中的项目何时更新,删除或更改,您应该能够在操作发生时根据需要修改网格存储。这绝对是首选方法。如果你不能这样做,你将不得不做一般的提取并使用onComplete回调来手动同步你的数组,这将非常慢,并且不能很好地扩展,在这种情况下你也可以只创建一个新的商店一起使用grid.setStore(myNewStore)
将其分配给网格这是一个基本的创建,更新和删除操作的小提琴:http://jsfiddle.net/BC7yT/11/
这些示例都利用了在创建商店时声明身份。
var store = new dojo.data.ItemFileWriteStore({
data: {
identifier : 'planet',
items: itemList
}
});
更新EXISITNG项目:
//If the store is not in your scope you can get it from the grid
var store = grid.store;
//fetchItemByIdentity would be faster here, but this uses query just to show
//it is also possible
store.fetch({query : {planet : 'Zoron'},
onItem : function (item ) {
var humans = store.getValue(item, 'humanPop');
humans += 200;
store.setValue(item, 'humanPop', humans);
}
});
插入新项目:
store.newItem({planet: 'Endron', humanPop : 40000, alienPop : 9000});
} catch (e) {
//An item with the same identity already exists
}
删除项目:
store.fetchItemByIdentity({ 'identity' : 'Gaxula', onItem : function (item ) {
if(item == null) {
//Item does not exist
} else {
store.deleteItem(item);
}
}});
答案 1 :(得分:7)
以下代码段可用于更新网格:
var newStore = new dojo.data.ItemFileReadStore({data: {... some new data ...});
var grid = dijit.byId("gridId");
grid.setStore(newStore);
修改强>
Dogo data grid reference guide(添加/删除行示例,更新网格数据示例)
答案 2 :(得分:3)
(我想你已经有了一个工作网格,你想完全改变网格的存储)
使用新值创建新的数据存储区:
dataStore = new ObjectStore({ objectStore:new Memory({ data: data.items }) });
(数据是对我的ajax请求的回应)
使用新网格更改网格商店:
grid.store = dataStore;
渲染:
grid.render();
答案 3 :(得分:3)
这将更新网格存储并在最新版本的Dojo 1.9中刷新网格视图
grid.store = store;
grid._refresh();
答案 4 :(得分:1)
我有一个服务器端过滤的EnhancedGrid,通过更改商店愉快地刷新,并在其他答案中显示。
但是我有另一个在应用过滤器时不会刷新的EnhancedGrid。它可能与它被过滤的客户端这一事实有关(但数据仍来自使用JsonRest商店的服务器),但我不知道原因。无论如何,解决方案是使用以下代码刷新:
grid.setFilter(grid.getFilter());
这很奇怪,但如果一切都失败了......
答案 5 :(得分:0)
有了这个,我可以更新一个特定的行。此示例适用于treegrid。
var idx = this.treeGrid.getItemIndex(item);
if(typeof idx == "string"){
this.treeGrid.updateRow(idx.split('/')[0]);
}else if(idx > -1){
this.treeGrid.updateRow(idx);
}