2013-03-06 7 views
2

Comme le titre le dit, je voudrais abandonner la requête ajax précédente. La requête de liste déroulante via ajax chaque fois qu'un utilisateur tape en lettres (ou chiffres) il demande des données, comme je l'ai dit par ajax, puis renvoie les données à la liste déroulante.ExtJS 4: Remote Combobox - Abort Demande précédente

Mon problème est que la requête ajax s'empilera chaque fois que je mets une entrée utilisateur sur le terrain.

Ce que je veux faire est d'annuler d'abord la demande précédente, puis de passer à la présente demande. J'ai essayé ce code:

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

Ce travail na pas, puis essayé ceci:

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

qui ne fonctionne pas pour moi non plus parce que j'ai une minuterie qui utilise également la demande ajax, qui sera également annulée si l'écouteur est exécuté.

Comment faire?

Répondre

6

Il m'a fallu beaucoup de temps pour le comprendre. Ext.Ajax.abort (request) est capable d'annuler les demandes. Mais il est assez difficile d'obtenir l'objet de requête en cours (ou mieux, l'objet de requête Ext.Ajax.abort) dans un magasin.

Enfin je suis arrivé ceci:

... 
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(); 
... 

pas agréable, mais des charges durables de magasin sont annulées de manière fiable.

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

Fonctionne comme un charme! – djxak