Javascript dojo dgrid,带有从url存储(json数据)的重新加载/刷新按钮

Javascript dojo dgrid,带有从url存储(json数据)的重新加载/刷新按钮,javascript,dojo,store,dgrid,dstore,Javascript,Dojo,Store,Dgrid,Dstore,首先,我使用的是Dojo1.1.0和dgrid 0.4.0。我正在创建一个带有几个DGRID的页面。一个网格特别需要从url加载JSON数据并显示它。目前,通过RequestMemory存储可以很好地实现这一点。但是,这是一个“内存”存储。虽然这对其他一些人来说可能微不足道,但我需要找到一种方法,按照现在的方式加载数据,然后在屏幕上添加一个刷新按钮,该按钮调用必要的函数/方法从url重新加载数据并重新填充dgrid JSON数据来自如下格式的url: [{"id":1,"name":"trans

首先,我使用的是Dojo1.1.0和dgrid 0.4.0。我正在创建一个带有几个DGRID的页面。一个网格特别需要从url加载JSON数据并显示它。目前,通过RequestMemory存储可以很好地实现这一点。但是,这是一个“内存”存储。虽然这对其他一些人来说可能微不足道,但我需要找到一种方法,按照现在的方式加载数据,然后在屏幕上添加一个刷新按钮,该按钮调用必要的函数/方法从url重新加载数据并重新填充dgrid

JSON数据来自如下格式的url:

[{"id":1,"name":"trans1","username":"trans1","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":2,"name":"trans2","username":"trans2","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":true},{"id":3,"name":"trans3","username":"trans3","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":4,"name":"trans4","username":"trans4","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":5,"name":"trans5","username":"trans5","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false},{"id":6,"name":"trans6","username":"trans6","status":"Available","inactive":"no","checkedout":"false","details":"","assignedNum":"0","completedNum":"0","avgTime":"00:00","aaOn":false}]
您将在下面看到的Require实际上包含的不仅仅是这个网格……因此还有所有额外的内容

我不需要更新本地存储,也不想监视url的更改。我只是希望能够根据需要从url重新加载数据

下面是我目前用于网格初始加载(工作)的代码,以及我需要开始工作的刷新按钮

需要(['dojo/store/Observable'、'dijit/Dialog'、'dijit/form/Select'、'dijit/form/MultiSelect'、'dijit/form/TextBox'、'dijit/layout/TabContainer'、'dojo/request'、'dojo/request/xhr'、'dijit/form/ToggleButton'、'dojo/parser'、'dojo/base/declare'、'dgrid/Grid/Selection'、'dgrid/Editor'、'dgrid/exteDictions/ColumnHider、'dgrid/extensions/Pagination、'dstore/RequestMemory、'dijit/form/Select、'dijit/registry'、'dojox/data/XmlStore、'dojo/domReady!'],函数(可观察、对话框、选择、多选择、文本框、TabContainer、ContentPane、请求、xhr、切换按钮、按钮、解析器、声明、网格、选择、编辑器、ColumnHider、分页、请求内存、选择、注册表、XmlStore){
//工人们
var workersStore=newrequestmemory({target:'/autoAssign/getWorkers.aa?TASKTYPE=transport&INACTIVE=FALSE'});
var workerGrid=new(声明([Grid,Selection,Pagination,Editor,ColumnHider]))({
收藏:workersStore,
类名:“dgrid自动高度”,
id:“workerGrid”,
行页码:6,
栏目:{
姓名:'姓名',
用户名:{
标签:“用户名”,
隐藏:真的
},
状态:“状态”,
assignedNum:'已分配',
completedNum:“已完成”,
avgTime:“平均值”,
aaOn:{
标签:“自动分配”,
编辑:“复选框”,
}
}
}“网格节点”);
workerGrid.on(“dgrid数据更改”,函数(evt){
var row=workerGrid.row(evt);
if(evt.cell.column.id=='aaOn'){
var promise=request('/autoAssign/setUserAaStatus.aa?USERNAME='+row.data.USERNAME+'&TASKTYPE=transport&STATUS='+evt.value);
}
});
workerGrid.startup();
//添加刷新按钮
var addRefreshButton=新建按钮({
标签:“刷新”,
样式:“float:right;”,
onClick:function(){
var promise=workersStore.fetch();
var结果=承诺。然后(函数(数据){
workerGrid.set(“集合”,workersStore);
workerGrid.refresh();
警报(“刷新按钮”);
});
}
},“刷新”).startup();

}
从技术上讲,要想做你想做的事情,你确实需要以某种方式更新本地存储。
dstore/RequestMemory
基本上是由
dstore/Request
dstore/Cache
组成的,其中一个
fetch
请求立即执行,然后缓存存储字段将包含所有未来的fetch操作。为了强制存储从服务器刷新,您基本上需要告诉存储其缓存不再有效,然后从服务器重新请求所有项目。这等同于以下内容:

workersStore.invalidate(); // Invalidate the cache
workersStore.fetch(); // Perform a new request for all items
workerGrid.refresh();
执行
fetch
后,
Cache
存储将理解它可以从其内存存储中提取所有请求

(调用
fetch
非常重要-如果您不调用上面的
fetch
,网格可能无法按预期工作。dgrid的OnDemandGrid和分页模块使用
fetchRange
执行范围查询,除非Cache知道它拥有存储的所有数据,否则它只会让这些数据传递到原始存储,在本例中是Request,它将尝试访问服务器-但您的服务可能不具备处理范围查询的能力,因此每次只返回整个数据集。)


太长了,读不下去了,我想这是比使用请求内存的人需要知道的更多的信息,所以我可能会提交一个API来更新和/或更新<代码>目标<代码>。上面的3行代码是TL;DR虽然。/P>Update:提交请求使这更容易:谢谢!这正是我所缺少的。实际上,我以前曾尝试过获取,然后刷新()网格…就像什么都没发生一样。这非常有效。令人惊讶的是,我已经搜索了3天,在任何地方都找不到记录。肯,奇怪的是,我刚刚意识到你发布的解决方案的简单版本的一个特点。如果记录添加到url(原始数据源)存储使用这些记录进行更新很好。但是,如果从原始数据源中删除记录,则存储不会删除它们。我希望它在这两种情况下都能从url完全重新加载Requestmemory存储。关于如何使删除场景正常工作,有什么建议吗?伙计,这是个好主意。你能尝试调用

worke吗rsStore.cachingStore.setData([])
在失效后立即失效?如果有效,我会在我的PR中添加一条注释(不确定我是否真的可以将其放入PR中,因为从技术上讲,我认为可以使用内存以外的东西作为缓存存储)。肯,是的,就是这样做的。