2013-03-06 46 views
2

就像標題所說,我想中止先前的ajax請求。每當用戶輸入字母(或數字)來請求數據時,通過ajax發出組合框請求,就像我通過ajax所說的那樣,然後將數據返回給組合框。ExtJs 4:遠程組合框 - 中止以前的請求

我的問題是,只要我在該字段中放入用戶輸入,ajax請求就會堆積起來。

我想要做的是先中止先前的請求,然後繼續處理目前的請求。我想這樣的代碼:

comboObj.onTypeAhead = Ext.Function.createInterceptor(comboObj.onTypeAhead, function() { 
    Ext.Ajax.abort(); //aborts the last Ajax request 
    return true; //runs the onTypeAhead function 
    }); 

沒有工作,那麼嘗試這樣做:

...... 
    listeners: { 
     beforequery: function(evt){ 
      Ext.Ajax.abortAll(); //cancel any previous requests 
      return true; 
     } 
    } 

這並沒有爲我工作是因爲我有同樣採用Ajax請求,這也將被取消計時器如果偵聽器被執行。

我該怎麼做?

回答

6

我花了很長時間才弄明白。 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(); 
... 

不是很好,但持久存儲加載可靠取消。

1
store.on('beforeload', function(store, operation) { 
    store.lastOperation = operation; 
    if (store.loading && store.lastOperation) { 
     Ext.Ajax.abort(store.lastOperation.request); 
    } 
}); 
+0

工程就像一個魅力! – djxak 2017-05-22 14:48:19