gpt4 book ai didi

javascript - SlikGrid 虚拟滚动 - 巨大的数据集

转载 作者:行者123 更新时间:2023-11-29 22:30:34 26 4
gpt4 key购买 nike

我能够扩展 Ajax-Loading Example以满足我的要求。

在当前的实现中,slick.remotemodel.js 中的加载器有一个名为 data 的变量,它是一个 javascript 对象数组。这个数组是网格的数据源。当我们继续滚动时,虽然 DOM 只渲染了页面大小的行,但 javascript 数组不断增长。

javascript 对象大小的上限是多少?是否有内存不足的可能性?可以说我的数据集大约有 ~125000 行,多列 ~10。我意识到可能需要更多信息来定义数据集的大小,但是根据上述信息,有人可以提供一些输入吗?

为了处理上述情况,我更新了代码。请看我的编辑。如果我遗漏了什么,请告诉我。

编辑:我的解决方案是在 onsuccess 方法中调用 clear 方法以确保数据数组只有 PAGESIZE # 个项目。

(function ($) {
/***
* Ajax loading example which is an extension
* of the http://mleibman.github.com/SlickGrid/examples/example6-ajax-loading.html
* example.
*/
function RemoteModel() {
// private

var fromPage = 0;
var rows = 0;

var PAGESIZE = 250;
var data = { length: 0 };
var h_request = null;
var req = null; // ajax request

// events
var onDataLoading = new Slick.Event();
var onDataLoaded = new Slick.Event();


function init() {
}


function isDataLoaded(from, to) {
for (var i = from; i <= to; i++) {
if (data[i] == undefined || data[i] == null)
return false;
}

return true;
}


function clear() {
for (var key in data) {
delete data[key];
}
data.length = 0;
}


function ensureData(from, to) {

if (req) {
req.abort();

for (var i = req.fromPage; i <= req.toPage; i++)
data[i * PAGESIZE] = undefined;
}

if (from < 0)
from = 0;

fromPage = Math.floor(from / PAGESIZE);
var toPage = Math.floor(to / PAGESIZE);

while (data[fromPage * PAGESIZE] !== undefined && fromPage < toPage)
fromPage++;

while (data[toPage * PAGESIZE] !== undefined && fromPage < toPage)
toPage--;

rows = (((toPage - fromPage) * PAGESIZE) + PAGESIZE);

if (fromPage > toPage || ((fromPage == toPage) && data[fromPage * PAGESIZE] !== undefined)) {

// TODO: look-ahead
return;
}

var url = "" ; // IMPORTANT : you should set this to your url which returns the data

if (h_request != null) {
clearTimeout(h_request);
}

h_request = setTimeout(function () {

for (var i = fromPage; i <= toPage; i++)
data[i * PAGESIZE] = null; // null indicates a 'requested but not available yet'

onDataLoading.notify({ from: from, to: to });

req = $.ajax({
url: url,
dataType: 'json',
success: function (response) {
onSuccess(response);
},
error: function () {
onError(fromPage, toPage);
}
});


req.fromPage = fromPage;
req.toPage = toPage;

}, 100);
}


function onError(fromPage, toPage) {
alert("error loading pages " + fromPage + " to " + toPage);
}

function onSuccess(response) {

//Solution to keep the data array bounded to pagesize: Call the clear method to have only PAGESIZE elements in the data array at any given point
clear();

//The visisble # of rows in the viewport could be only ~20 but
// i'm populating PageSIZE which acts like the client-side cache, in my case 250,
// so that I avoid too many server hops
var from = fromPage * PAGESIZE, to = from + PAGESIZE;

data.length = response.count;

for (var i = 0; i < response.Fields.length; i++) {
data[from + i] = response.Fields[i];
data[from + i].index = from + i;
}

req = null;

onDataLoaded.notify({ from: from, to: to });
}


function reloadData(from, to) {
for (var i = from; i <= to; i++)
delete data[i];

ensureData(from, to);
}


init();

return {
// properties
"data": data,

// methods
"clear": clear,
"isDataLoaded": isDataLoaded,
"ensureData": ensureData,
"reloadData": reloadData,

// events
"onDataLoading": onDataLoading,
"onDataLoaded": onDataLoaded
};
}

// Slick.Data.RemoteModel
$.extend(true, window, { Slick: { Data: { RemoteModel: RemoteModel}} });
})(jQuery);
enter code here

谢谢

最佳答案

我的解决方案是在 onsuccess 方法中调用 clear 方法以确保数据数组只有 PAGESIZE # 个项目。这只会将数据保留在必需的 javascript 对象数组中,其他所有内容都应设置为未定义。

关于javascript - SlikGrid 虚拟滚动 - 巨大的数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7149639/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com