在JavaScript中处理大型栅格数据集

时间:2010-12-06 17:12:50

标签: javascript jquery asp.net-mvc extjs sproutcore

使用JavaScript在客户端上处理大型数据集(100K)有哪些更好的解决方案。特别是,如果您具有多列排序和搜索功能,那么如何处理数据的获取(和预取),客户端模型绑定(用于显示)以及缓存数据。

我认为一个好的解决方案是在后台做一些深思熟虑的工作。例如,最初,如果表格显示N个项目,它可能会获取2N项目,返回用户的数据,然后在后台获取下一个2N项目(即使用户未请求此项目)。当用户进行搜索/排序更改时,它会抛出(或者甚至可能缓存初始基本情况),并执行类似的功能。

您能分享一下您所见过的最佳解决方案吗?

由于

5 个答案:

答案 0 :(得分:3)

使用像DataTables这样的jQuery表插件:http://datatables.net/

它支持用于排序,过滤和分页的服务器端处理。它包括流水线支持以预取下一页x记录:http://www.datatables.net/examples/server_side/pipeline.html

实际上,DataTables插件有4种不同的工作方式: 1.使用HTML表,您可以发送一堆HTML,然后让客户端的所有排序,过滤和分页工作。 2.使用JavaScript数组,您可以发送一个2D数组并让它从那里创建表。 3. Ajax源 - 这不适用于您。 4.服务器端,您以JSON格式将数据发送到空表,并让DataTables从那里获取它。

答案 1 :(得分:3)

SlickGrid完全符合您的要求。 (Demo

使用AJAX数据存储,SlickGrid可以处理数百万行而不会退缩。

答案 2 :(得分:2)

由于您使用Ext JS对此进行了标记,如果您还没有看到它,我会指向Ext.ux.LiveGrid。源代码可用,因此您可以查看它们是如何解决此问题的。这是Ext JS世界中流行且广泛使用的扩展。

话虽如此,我个人认为(虚拟地)加载那么多数据作为用户体验是无用的。手动拉动滚动条(每个像素跳过数百条记录)对于简单地键入您想要的内容来说是一种非常低劣的体验。我更喜欢一些强大的过滤/搜索,而不是向用户呈现那么多数据。

如果你去谷歌而不是搜索框,它只是将整个互联网加载到一个长的虚拟列表中,你必须滚动才能找到你的网站......:)

答案 3 :(得分:1)

这取决于数据的使用方式。

对于大型数据集,浏览器的查找功能已足够,只返回一个直接的HTML表是有效的。加载需要一段时间,但显示器对较旧,较慢的客户端做出响应,您永远不必担心它会中断。

当客户端进行排序和搜索,并且您没有立即显示整个表时,我让服务器通过XMLHTTPRequest发送制表符分隔表,并使用list = String.split在浏览器中解析它们( ' \ n'),并通过重复调用$(' node')来更新显示内容.internalHTML =' blah'。 JS引擎可以非常有效地存储长字符串。在客户端上运行速度比显示,隐藏和重新排列DOM节点要快得多。在运行中创建和销毁新的DOM节点结果非常慢。按需将每一行拆分成字段似乎有效;我还没有尝试过那种程度的自由。

我从来没有尝试过明显的预取和放大器。背景技巧,因为这些其他方法运作良好。

答案 4 :(得分:0)

查看example数据网格和 电子表格。

对于过滤/排序/分页目的,您可能会对精选thisthis comprehensive list感兴趣,作为免费替代方案。

如果只需显示巨大的列表而没有任何其他功能Handsontable就足够了。