2

Extjsダイレクトプロキシを使用してリストからアイテムをロードするストアがあります。

   proxy : {
                type: 'direct',
                api: {
                    read: bomManagementAction.bomQuickDetails
                }                      
              }

応答はグリッドパネルに表示されます。
より多くのアイテムを選択すると、完了するまでに時間がかかるため、より長いリクエストが保留中で、短いリクエストを送信した場合、グリッドは間違いなく後者で更新されますが、前者のリクエストが発生するとどうなりますか?完了すると、グリッドは望ましくない前のグリッドで再更新されます。'' autoabort'configが' Ext.data.Connection'クラスに存在するが、proxy.directには存在しないことを知りました...
助けてください

4

2 に答える 2

5

ストアのロードを選択的にキャンセルする場合にも同様の問題が発生しました。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();
...

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

たぶん、ExtjsDirect接続のためにこのアイデアを変えることができます。

于 2013-03-12T13:57:17.697 に答える
0

私が知るAjax.abort()限り、直接呼び出しでは機能しません(サーバーに送信される要求は、サーバーから返される要求とは異なるようです。これは、直接エンジンがその間に独自の処理を行うためです)。

あなたの質問に直接答えているかどうかはわかりませんが、解決策が次のような同様のシナリオがありました。

/**
 * 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 );
    }
});
于 2013-05-31T10:15:00.943 に答える