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的默认实现,尤其是queryandqueryEngine函数。默认情况下,他们总是首先到达主商店,在您的情况下就是JsonRest商店。只有在加载数据后,缓存存储才会更新(在您的情况下是Memory存储)。

现在,如果您检查_setSortDGrid List.js文件中的函数refresh和 DGrid OnDemandList.js中的函数,您将看到默认情况下 DGrid 调用querycurrent 的方法store来获取以不同方式排序的新项目列表。在您的情况下,该商店是dojo/store/Cache.

综上所述,当用户单击要排序的列时,DGrid 会查询,然后再Cache查询JsonRest,然后再查询服务器,然后服务器返回新数据,然后Cache存储在Memory存储中。

实际上,您可以使用 Firebug(Firefox 扩展)来确认这一点。就我而言,每当我尝试排序时,Firebug 都会向服务器显示一个新请求以获取新数据。

当有很多行时这很有意义,因为 DGrid 旨在仅加载第一批行,然后在用户向下滚动时更新网格。当排序发生变化时,第一批可见的行可能不同并且可能尚未加载,因此 DGrid 必须先加载它们。

但在我的情况下,Json 请求在单个请求期间返回所有数据。我不喜欢默认实现并实现了我自己的缓存存储,它在更改排序时不需要访问服务器。我现在不能分享实现,但是当我有时间整理代码时会尝试做。

至于现在,如果您切换到JsonRest仅存储,您应该不会注意到任何性能问题(考虑到在更改排序时无论如何都会访问服务器)。

我不确定是什么导致了重复行的具体问题,但我记得当我的缓存存储没有正确实现时也看到了它(如果我没记错的话,它与加载数据时的延迟请求有关)。您可以尝试通过在store的getquery函数中添加(再次使用 Firebug)断点来调试它。我敢打赌,当用户更改排序后请求仍在从服务器加载数据时Cache,DGrid 会尝试使用该方法加载特定的行(该get方法会命中缓存) 。query但我可能错了,所以如果可以的话,请先尝试确认。

于 2013-06-12T19:40:14.280 回答