【问题标题】:Dojo DataGrid Virtual Scrolling How-To?Dojo DataGrid 虚拟滚动操作方法?
【发布时间】:2012-03-29 23:19:46
【问题描述】:

我一直在寻找这个。我正在使用 dojox.grid.datagrid 并且我有一个 ajax 调用,可以返回 200-300 行。

网格在 Chrome 中的渲染和滚动效果很好,但在 IE 7 和 8 中滚动速度非常慢。我想使用虚拟滚动来尝试解决问题,但找不到任何示例代码。

这是我的代码目前的样子。

function setupAvailableScenes(location) {
var avaiableScenesGridPane = dijit.byId("AvaiableScenesGridPane");
var availableScenesGrid = dijit.byId("AvailableScenesGrid");
if (_isFirstLoad) {

    availableScenesGrid = new dojox.grid.DataGrid({
        id: 'AvailableScenesGrid',
        store: availableScenesStore,
        query: { Id: "*" },
        sortInfo: "1",
        rowsPerPage: 20,
        autoHeight:20,
        style: "width:315px",
        structure: [
                { name: "Available Scenes", field: "Name", width: "85%" },
                {   name: " ",
                    field: "_item",
                    rowsPerPage: "25",
                    type: dojox.grid.cells._Widget,
                    editable: false,
                    width: "15%",
                    formatter: function (scene) {
                        return new dijit.form.Button(
                        {
                            label: "+",
                            onClick: function () {
                                AddSceneToSelectedScenes(scene);
                            }
                        })
                    }
                }
            ]
    });

    avaiableScenesGridPane.set('content', availableScenesGrid);
}

var availableScenesStore = new dojo.data.ItemFileWriteStore({
    url: _applicationPath + "/Location/" + location.Id + "/Scene.json",
    preventUrlCache: true
});

availableScenesGrid.setStore(availableScenesStore);

}

【问题讨论】:

    标签: javascript jquery datagrid dojo grid


    【解决方案1】:

    由于您指定 rowsPerPage=25,它已经在进行虚拟滚动(仅当用户向下滚动时它才会拉出新的行集)

    由于您提到滚动非常慢,因此性能问题似乎与渲染新行有关 - 您可以尝试一些方法来提高性能: 1) 移除 autoHeight 属性。而是在样式属性中指定固定高度 2) 在格式化程序函数中,尝试返回一个简单的 html 按钮/锚点,而不是返回 dijit,样式为按钮 所以删除 type:dojox.grid.cells._Widget 属性并在格式函数中返回您要使用的 html

    【讨论】:

    • 感谢您的浏览。我知道它应该进行虚拟滚动,但我没有看到标题中发送的参数。我假设要返回的起始行和行数是我必须发送到我的控制器然后在我的数据层中处理以返回行数的参数。我会看看在 dijit 中是否可以使用一个简单的按钮。让我知道您对虚拟滚动的看法。
    • 嗯——你能澄清一下吗?您希望发送哪些标头参数?你指的是延迟加载还是虚拟滚动?
    • 虚拟滚动。基本上,我希望网格一次加载 25-50 行。
    • 所以它应该已经这样做了。您可以尝试将 console.log 语句放在您的格式函数中。当您向下滚动超过 25 行时,您应该会看到一组新的 console.log 语句,确认虚拟滚动正在工作。
    • 好的,我再次阅读了您的评论,您所指的实际上是延迟加载(因为您希望它转到服务器以加载新的行集)QRS 是您想要的 @ryan-corradini提及。但是,要小心,因为去服务器获取新批次可能会进一步减慢滚动速度。我建议根据您的用例使用具有适当 rowsPerPage 设置的 QRS
    【解决方案2】:

    通常,提高 DataGrid 性能的最重要的事情之一就是丢弃 ItemFileReadStore/WriteStore 并使用优化的数据存储(我个人喜欢 QueryReadStore)。这意味着需要某种类型的服务器端 servlet(PHP/JSP/等)来处理虚拟滚动/分页,但我已经看到,与仅使用由 JSON 文件支持的存储相比,性能有很大提升。

    需要考虑的其他一些事情,可能有帮助,也可能没有帮助:

    • 为您的匿名格式化程序函数命名并尝试在打开 Chrome 或 Firebug 配置文件的情况下滚动表格以查看它是否占用了很多周期(或者,如 Vijay Agrawal 所说,您可以尝试替换 dijit.form.Button带有香草 html <button> 标签)
    • 您实际上不需要为该单元格指定dojox.grid.cells._Widget 类型;拥有一个返回有效 Dijit 的自定义格式化程序应该足以让 Grid 做正确的事情。

    【讨论】:

    • Ryan,非常感谢您在 google+ 上回复我并在此回复。我想使用读取存储,但我需要即时更新网格,所以我认为我需要坚持写入存储(如果我错了,请纠正我)。我查看了您在您的网站上发布的示例代码,将来我会记住它。我想知道,如果网格将保持可编辑状态,我是否使用了 JsonStore。 IE。我可以编辑网格然后通过 ajax 调用发回吗?或者我是否需要一个写入存储来编辑网格。我想我知道,但我想错了;)
    • 一个 JsonRest 存储应该允许你持久化你的更改。 Dojo 网站上有一个教程介绍了如何执行此操作:dojotoolkit.org/documentation/tutorials/1.6/store_driven_grid
    猜你喜欢
    • 2011-08-02
    • 2011-11-05
    • 2017-04-13
    • 1970-01-01
    • 2010-11-15
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多