我有一个使用Extjs直接代理从列表中加载w.r.t项目的商店。
proxy : {
type: 'direct',
api: {
read: bomManagementAction.bomQuickDetails
}
}
并且响应显示在网格面板中
如果选择了更多的项目,则需要很长时间才能完成,因此如果更长的请求处于待处理状态,并且我们发送了一个简短的请求,那么网格肯定会用后者更新,但是当前一个请求发生时会发生什么然后完成网格将重新更新前一个不可取的网格。我发现“ autoabort
”配置存在于“ Ext.data.Connection
”类中,但不存在于proxy.direct中...
请帮忙
答案 0 :(得分:5)
我在选择性取消商店负载方面遇到了类似的问题。 Ext.Ajax.abort(请求)能够中止请求。但是从商店获取当前请求对象(或者更好,请求对象Ext.Ajax.abort需要)非常困难。
最后我明白了:
...
if (store.loading && store.lastOperation) {
var requests = Ext.Ajax.requests;
for (id in requests)
if (requests.hasOwnProperty(id) && requests[id].options == store.lastOperation.request) {
Ext.Ajax.abort(requests[id]);
}
}
store.on('beforeload', function(store, operation) {
store.lastOperation = operation;
}, this, { single: true });
store.load();
...
不太好但持久的商店负载可靠地取消。
也许有人可以为Extjs Direct连接改变这个想法。
答案 1 :(得分:0)
从我可以看出,Ajax.abort()
对直接调用不起作用(发送到服务器的请求似乎与从服务器返回的请求不同,因为直接引擎在它们之间做了自己的事情)。 / p>
虽然我不确定我是否直接回答了你的问题,但我有一个类似的情况,解决方案是这样的:
/**
* A proxy class that ensures only the reponse to the last read request is
* processed.
*
* A quick user actions may result in more than one request sent to the server,
* but it is possible for the server to return a response to the second request
* before returning that of the first request. This will mean the the store
* will be populated with records that do not correspond to the latest user
* action.
*
*/
Ext.define('Ext.data.proxy.SerialDirect', {
extend: 'Ext.data.proxy.Direct',
alternateClassName: 'Ext.data.DirectSerialProxy',
alias: 'proxy.serialdirect',
doRequest: function(operation, callback, scope) {
this.callParent( arguments );
// Store the last read request
if ( operation.request.action == "read" ) {
this.lastReadRequest = operation.request;
}
},
processResponse: function(success, operation, request, response, callback, scope) {
// abort if the request is a read one and does not correspond to the
// last read request
if ( request.action == "read" && request != this.lastReadRequest )
return;
this.callParent( arguments );
}
});