为什么是Dojo网格.刷新正在进行另一个服务器调用

Why Dojo grid.refresh is making another server call?

本文关键字:另一个 服务器 调用 正在进行 刷新 Dojo 网格 为什么      更新时间:2023-09-26

我们正在使用dojo JsonRest。每当我们需要用新数据刷新网格时,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.
});

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

myCacheDataStore = new Cache(myDataStore, new Memory({});
myObservableDataStore = new Observable(myCacheDataStore)    

你应该能够传递myObservableDataStore来代替myDataStore。

要更新或刷新网格,您可以更改目标url或直接更新myDataStore中的标题并调用grid.refresh。我还没有测试过头部的更新,但我的例子改变了目标url从

/rest/users/ 

/rest/users/?username=jdoe 

和网格更新得很好

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

或者

myDataStore.headers[paramName] = paramValue

因为你的MyJsonRest存储混合的选项提供给"get"到头以及

这个问题的答案似乎比公认的答案要直接得多(从它末尾的注释可以看出)。

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

从您的示例中可以看出,您最初调用get是否有其他原因,但是直接调用存储方法不会填充像网格这样的小部件-小部件自己直接访问存储