Javascript 为什么Dojo grid.refresh正在进行另一个服务器调用?

Javascript 为什么Dojo grid.refresh正在进行另一个服务器调用?,javascript,dojo,dojox.grid,Javascript,Dojo,Dojox.grid,我们正在使用dojojsonrest。每当我们需要用新数据刷新网格时,dojo就会触发两个服务器调用 下面是代码 var MyJsonRest = declare(JsonRest, { get: function(id, options) { return this.inherited( arguments, [id, lang.mixin(this.headers, options)]); } }); myDataSt

我们正在使用dojojsonrest。每当我们需要用新数据刷新网格时,dojo就会触发两个服务器调用

下面是代码

var MyJsonRest = declare(JsonRest, {
   get: function(id, options) {
       return this.inherited(
           arguments, 
           [id, lang.mixin(this.headers, options)]);
   }
});

myDataStore = MyJsonRest({
    target: someurl,
   headers: { 
      'moduleUName': somemodulename
   },
   idAttribute: "id",
       query: function(query, options) {
          // some other code                    
      }                   

});

myDataStore.get("", { paramName: paramValue }).then(function(result) { // this fires a request to server
  gridObj.refresh(); // this fires same request 2nd time to the server
  // if the gridObj.refresh() is commented out, then the grid does not displayes the new data.
});

为了让网格在不触发刷新的情况下检测存储中的更改,您应该使用dojo.store.Observable包装JsonRest存储。然后,对存储的任何更新都将在网格中自动更新

myCacheDataStore = new Cache(myDataStore, new Memory({});
myObservableDataStore = new Observable(myCacheDataStore)    
您应该能够传递myObservableDataStore而不是myDataStore

要更新或刷新网格,您可以更改目标url或直接更新myDataStore中的标题,然后调用grid.refresh。我还没有测试过标题的更新,但是我的示例将目标url从

/rest/users/ 

网格更新良好

myDataStore.target = '/rest/users/?username=jdoe'
或许

myDataStore.headers[paramName] = paramValue

由于MyJsonRest存储区也将提供的选项混合到“get”标题中。

这个问题的答案似乎比公认的答案简单得多(结尾处的一条评论证明了这一点)

您正在商店中调用
get
,然后在该调用的成功处理程序中调用
grid.refresh()
。由于您使用的是基于服务器的存储,
get
将自己触发一个请求。网格将触发另一个请求(通过商店的
query
方法),以获取要填充自身的项目列表


从您的示例中不清楚您最初调用
get
是否还有其他原因,但是直接调用store方法不会填充网格之类的小部件-小部件自己直接访问存储。

谢谢您的回答。我如何将上述代码包装在observable中?很抱歉,答案含糊不清。我添加了一个代码片段,这是假设您需要dojo/store/observative,我尝试了您所说的。但它不起作用。没有错误。但是现在它也不显示包含初始数据的网格了。我假设您使用的是dojox.grid.DataGrid小部件?如果是这样,您是否将myObservableDataStore包装在dojo.data.ObjectStore中?我过去所做的是将JsonRest包装在几个不同的存储中,以实现自动更新。我已经更新了代码片段以反映更改。
myDataStore.headers[paramName] = paramValue