1

在我的一个应用程序中,由于在 Kendo Ui-grid 中绑定了 500 000 条记录,浏览器会挂起并崩溃。该网格总共包含 20 列,所有数据都通过剑道网格中的角度从 webapi 返回。

它适用于 3 列,当更改为 15 列时,超过 100k 的记录会出现问题。

所以我需要测试剑道网格上可以保存多少列和记录。我发现剑道中有一些可用的选项称为虚拟化来加载批量记录。

演示站点是:http ://dojo.telerik.com/@sahir/OSeRo

因此,在人员 js 中有数据时,我尝试在该文件中再添加两列,我在列中获取对象对象。

问题发生在 100k 记录绑定以上,剑道网格中没有分页。我在下面附上了一个演示项目截图,用于测试网格。

在此处输入图像描述

代码如下:

<!DOCTYPE html>
<html>
<head>
    <base href="">
    <style>html { font-size: 14px; font-family: Arial, Helvetica, sans-serif; }</style>
    <title></title>
    <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2017.1.118/styles/kendo.common-material.min.css" />
    <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2017.1.118/styles/kendo.material.min.css" />
    <link rel="stylesheet" href="https://kendo.cdn.telerik.com/2017.1.118/styles/kendo.material.mobile.min.css" />

    <script src="https://kendo.cdn.telerik.com/2017.1.118/js/jquery.min.js"></script>
    <script src="https://kendo.cdn.telerik.com/2017.1.118/js/kendo.all.min.js"></script>
    <script src="people.js" ></script>
</head>
<body>
<!--<script src="../content/shared/js/people.js"></script>-->


<div id="example">
    <div id="message" class="box wide"></div>

    <div id="grid"></div>

    <script>
        $(function() {
            var count = 500000;

            if (kendo.support.browser.msie) {
                if (kendo.support.browser.version < 10) {
                    count = 100000;
                } else {
                    count = 200000;
                }
            }

            $("#message").text(kendo.format("Generating {0} items", count));

            generatePeople(count, function(data) {
                var initStart;
                var renderStart;

                $("#message").text("");

                setTimeout(function() {
                    initStart = new Date();

                    $("#grid").kendoGrid({
                        dataSource: {
                            data: data,
                            pageSize: 20
                        },
                        height: 543,
                        scrollable: {
                            virtual: true
                        },
                        pageable: {
                            numeric: false,
                            previousNext: false,
                            messages: {
                                display: "Showing {2} data items"
                            }
                        },
                        columns: [
                            { field: "Id", title: "ID", width: "110px" },
                            { field: "FirstName", title: "First Name", width: "130px" },
                            { field: "LastName", title: "Last Name", width: "130px" },
                            { field: "City", title: "City", width: "130px" },
                            { field: "CashId", title: "Cash ID", width: "130px" },
                            { field: "Title" },
                            { field: "productName"},

                        ]
                    });

                    initEnd = new Date();

                    $("#message").text(kendo.format("Kendo UI Grid bound to {0} items in {1} milliseconds", count, initEnd - initStart));
                });
            });
        });
    </script>
</div>


</body>
</html>

自定义 people.js

var firstNames = ["Nancy", "Andrew", "Janet", "Margaret", "Steven", "Michael", "Robert", "Laura", "Anne", "Nige"],
    lastNames = ["Davolio", "Fuller", "Leverling", "Peacock", "Buchanan", "Suyama", "King", "Callahan", "Dodsworth", "White"],
    cities = ["Seattle", "Tacoma", "Kirkland", "Redmond", "London", "Philadelphia", "New York", "Seattle", "London", "Boston"],
    titles = ["Accountant", "Vice President, Sales", "Sales Representative", "Technical Support", "Sales Manager", "Web Designer",
    "Software Developer", "Inside Sales Coordinator", "Chief Techical Officer", "Chief Execute Officer"],

 productNames =["Nancy", "Andrew", "Janet", "Margaret", "Steven", "Michael", "Robert", "Laura", "Anne", "Nige"]
    birthDates = [new Date("1948/12/08"), new Date("1952/02/19"), new Date("1963/08/30"), new Date("1937/09/19"), new Date("1955/03/04"), new Date("1963/07/02"), new Date("1960/05/29"), new Date("1958/01/09"), new Date("1966/01/27"), new Date("1966/03/27")],
    cashId= ["Accountant", "Vice President, Sales", "Sales Representative", "Technical Support", "Sales Manager", "Web Designer",
    "Software Developer", "Inside Sales Coordinator", "Chief Techical Officer", "Chief Execute Officer"];
function createRandomData(count) {
    var data = [],
        now = new Date();
    for (var i = 0; i < count; i++) {
        var firstName = firstNames[Math.floor(Math.random() * firstNames.length)],
            lastName = lastNames[Math.floor(Math.random() * lastNames.length)],
            city = cities[Math.floor(Math.random() * cities.length)],
            title = titles[Math.floor(Math.random() * titles.length)],
            birthDate = birthDates[Math.floor(Math.random() * birthDates.length)],
            CashId  = cashId[Math.floor(Math.random() * cashId.length)],
            age = now.getFullYear() - birthDate.getFullYear(),
            productName  = productNames[Math.floor(Math.random() * productNames.length)];

        data.push({
            Id: i + 1,
            FirstName: firstName,
            LastName: lastName,
            City: city,
            Title: title,
            BirthDate: birthDate,
            CashId:cashId,
            Age: age,
            productName:productNames

        });
    }
    console.log(data);
    return data;
}

function generatePeople(itemCount, callback) {
    var data = [],
        delay = 25,
        interval = 500,
        starttime;

    var now = new Date();
    setTimeout(function() {
        starttime = +new Date();
        do {
            var firstName = firstNames[Math.floor(Math.random() * firstNames.length)],
                lastName = lastNames[Math.floor(Math.random() * lastNames.length)],
                city = cities[Math.floor(Math.random() * cities.length)],
                title = titles[Math.floor(Math.random() * titles.length)],

                birthDate = birthDates[Math.floor(Math.random() * birthDates.length)],
                CashId=  cashId[Math.floor(Math.random() * cashId.length)],
                age = now.getFullYear() - birthDate.getFullYear(),            
                productName  = productNames[Math.floor(Math.random() * productNames.length)];
            data.push({
                Id: data.length + 1,
                FirstName: firstName,
                LastName: lastName,
                City: city,
                Title: title,
                BirthDate: birthDate,
                CashId:cashId,
                Age: age,
                productName:productNames

            });
        } while(data.length < itemCount && +new Date() - starttime < interval);

        if (data.length < itemCount) {
            setTimeout(arguments.callee, delay);
        } else {
            callback(data);
        }
    }, delay);
}
4

1 回答 1

1

更新people.js第 68 行 ( cashIdto CashId) 和 70 ( productNamesto productName)

data.push({
    Id: data.length + 1,
    FirstName: firstName,
    LastName: lastName,
    City: city,
    Title: title,
    BirthDate: birthDate,
    CashId:CashId,
    Age: age,
    productName:productName

});
于 2017-02-07T14:46:20.697 回答