为什么 Dojo grid.refresh 正在调用另一个服务器?
Why Dojo grid.refresh is making another server call?
我们正在使用 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 中的 headers 并调用 grid.refresh。我没有测试 headers 的更新,但我的示例将目标 url 从
更改为
/rest/users/
到
/rest/users/?username=jdoe
并且网格更新正常。
myDataStore.target = '/rest/users/?username=jdoe'
或者也许
myDataStore.headers[paramName] = paramValue
由于您的 MyJsonRest 商店将 "get" 中提供的选项也混合到 headers 中。
这个问题的答案似乎比已接受的答案更直接(正如接近末尾的评论所证明的那样)。
您在商店中调用 get
,然后在该调用的成功处理程序中调用 grid.refresh()
。由于您使用的是基于服务器的商店,因此 get
将自行触发一个请求。网格将触发另一个请求(通过商店的 query
方法)以获取用于填充自身的项目列表。
从您的示例中不清楚您最初调用 get
是否还有其他原因,但直接调用存储方法不会像网格那样填充小部件 - 小部件自己直接访问存储。
我们正在使用 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 中的 headers 并调用 grid.refresh。我没有测试 headers 的更新,但我的示例将目标 url 从
更改为/rest/users/
到
/rest/users/?username=jdoe
并且网格更新正常。
myDataStore.target = '/rest/users/?username=jdoe'
或者也许
myDataStore.headers[paramName] = paramValue
由于您的 MyJsonRest 商店将 "get" 中提供的选项也混合到 headers 中。
这个问题的答案似乎比已接受的答案更直接(正如接近末尾的评论所证明的那样)。
您在商店中调用 get
,然后在该调用的成功处理程序中调用 grid.refresh()
。由于您使用的是基于服务器的商店,因此 get
将自行触发一个请求。网格将触发另一个请求(通过商店的 query
方法)以获取用于填充自身的项目列表。
从您的示例中不清楚您最初调用 get
是否还有其他原因,但直接调用存储方法不会像网格那样填充小部件 - 小部件自己直接访问存储。