2

タイトルの通り、前回のajaxリクエストを中止したいと思います。ユーザーが文字 (または数字) を入力するたびに ajax を介してコンボボックスを要求し、ajax を介して言ったようにデータを要求し、データをコンボボックスに返します。

私の問題は、フィールドにユーザー入力を入れるたびに 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リクエストも使用するタイマーがあるため、これもうまくいきませんでした。

どうすればいいですか?

4

2 に答える 2

6

それを理解するのに長い時間がかかりました。Ext.Ajax.abort(request)はリクエストを中止することができます。ただし、ストアから現在のリクエストオブジェクト(またはより適切には、リクエストオブジェクト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();
...

良くありませんが、永続的なストアのロードは確実にキャンセルされます。

于 2013-03-12T14:01:03.510 に答える
1
store.on('beforeload', function(store, operation) {
    store.lastOperation = operation;
    if (store.loading && store.lastOperation) {
        Ext.Ajax.abort(store.lastOperation.request);
    }
});
于 2016-07-19T14:45:52.260 に答える