0

データのテーブルを表示するために、dgrid 0.3.2 と JsonRest を使用しています。最近、dgrid 0.3.6 または 0.3.7 へのアップグレードを検討しています。ほとんど同じように動作しますが、新しいバージョンの dgrid では、ユーザーが列ヘッダーをクリックして十分に速く並べ替えると、グリッドに重複した行が表示され始めるようです。応答の JSON と範囲が正しいことを確認しました。これは、dgrid 0.3.2 を使用したときに発生しなかったようです。

問題を再現し、グリッドとストアのセットアップ方法を模倣する簡単なテスト ケースを次に示します。私は何か間違ったことをしていますか?JsonRest をキャッシュにラップしない場合、この問題は発生しないため、問題があることは確かですが、JSON 応答をキャッシュしないことによるパフォーマンスへの影響についてはわかりません。

<!doctype html>
<html>

<head>
<%
    String dgridVer = request.getParameter("dgridVer");
    if (dgridVer==null) { dgridVer = "0.3.6"; }
%>
<script type="text/javascript">
    var dojoConfig = {
        isDebug: true,
        baseUrl: 'dojo',
        packages: [
            { name: 'dojo',      location: 'dojo' },
            { name: 'dijit',     location: 'dijit' },
            { name: 'dojox',     location: 'dojox' },
            { name: 'dgrid',     location: 'dgrid-<%=dgridVer%>' },
            { name: 'put-selector',     location: 'put-selector' },
            { name: 'xstyle',    location: 'xstyle' },
            { name: 'datagrid', location: '../datagrid' }
        ]
    };
</script>
<script src="dojo/dojo/dojo.js"></script>
</head>

<body>
Try sorting a column as fast as you can.  Look for duplicated rows.<br>
Using dgrid version: <%=dgridVer %><p>

<div id='gridDiv'></div>

<script>
require(['dgrid/Grid', 'dgrid/extensions/Pagination', 'dojo/store/JsonRest',
            'dojo/store/Cache', 'dojo/store/Memory', 'dojo/_base/declare', 'dojo/domReady!'], 
    function(Grid, Pagination, JsonRest,
                Cache, Memory, declare) {

    var columns = [
        { field: "first", label: "First Name" },
        { field: "last",  label: "Last Name" },
        { field: "age",    label: "Age" }
    ];

    var store = new JsonRest({
        target: 'testData.jsp',
        sortParam: "sortBy"
    });
    store = Cache(store, Memory());

    var grid = new (declare([Grid, Pagination]))({
        columns: columns,
        store: store,
        loadingMessage: 'Loading...',
        rowsPerPage: 4,
        firstLastArrows: true
    }, 'gridDiv');

});
</script>

</body>

</html>
4

1 に答える 1

1

Cache.jsのデフォルトの実装、特にqueryおよびqueryEngine関数を確認してください。デフォルトでは、それらは常に最初にマスター ストア (この場合はストア) に到達しますJsonRest。データがロードされた後にのみ、キャッシュ ストアが更新されます (この場合はMemoryストア)。

ここで、_setSortDGrid List.jsファイルの関数refreshと DGrid OnDemandList.jsの関数を確認すると、デフォルトで DGrid が current のqueryメソッドを呼び出して、store異なる方法で並べ替えられたアイテムの新しいリストを取得することがわかります。あなたの場合、その店はdojo/store/Cacheです。

要約すると、ユーザーが列をクリックして並べ替えると、DGrid はCacheにクエリをJsonRest実行し、サーバーは にクエリを実行し、サーバーはサーバーにクエリを実行し、サーバーは新しいデータを返し、それをCacheストアにMemory格納します。

これは、たとえば Firebug (Firefox の拡張機能) で実際に確認できます。私の場合、並べ替えを試みるたびに、Firebug はサーバーに新しいデータを取得するための新しい要求を表示していました。

DGrid は行の最初のバッチのみをロードし、ユーザーが下にスクロールしたときにグリッドを更新するように設計されているため、これは多くの行がある場合に意味があります。並べ替えが変更されると、最初に表示される行のバッチが異なる可能性があり、まだロードされていない可能性があるため、DGrid はそれらを最初にロードする必要があります。

しかし、私の場合、Json リクエストは 1 回のリクエストですべてのデータを返していました。デフォルトの実装が気に入らなかったので、ソートを変更するときにサーバーへの移動を必要としない独自のキャッシュ ストアを実装しました。今は実装を共有することはできませんが、コードを整理する時間があれば共有しようと思います.

今のところ、ストアのみに切り替えた場合、パフォーマンスの問題に気付くことはありませんJsonRest(ソートを変更するとサーバーへのトリップがあることを考慮してください)。

重複行の具体的な問題の原因はわかりませんが、キャッシングストアが適切に実装されていなかったときにも見たことを覚えています (正しく思い出せば、データをロードするときの遅延リクエストと関係がありました)。ストアの 関数getquery関数にブレークポイントを追加して (再び Firebug で) デバッグを試みることができます。私の賭けは、ユーザーが並べ替えを変更した後、要求がまだサーバーからデータをロードしている間Cacheに、DGrid がgetメソッド (キャッシュにヒットする) を使用して特定の行をロードしようとすることです。queryでも間違っているかもしれないので、できれば最初に確認してみてください。

于 2013-06-12T19:40:14.280 に答える