数据库_ajax获取数据库数据_三重好礼

2021-05-04 00:24

如果您想:

了解树控件在SAPUI5/OpenUI5中的工作原理,请阅读本文了解当用户滚动和钻取树时,如何按需动态加载数据获取可以在客户端和服务器端轻松调试和分析的工作代码

树是一个非常合适的话题:正如我所见证的,一个人可以在UI5框架上工作很多年,而不必使用树并将其绑定到数据模型。数量有限的文档还表明,树及其绑定方式并不是应用程序开发人员感兴趣的主要焦点,但有时您只需要显示层次结构数据。而且很多。有哪些选择?

让我们探索这个主题,了解ODataTreeBinding和树的OData结构——并基于一个纯文本创建一个UI5文件浏览器节点.js服务器(没有任何OData助手库)。

首先,OpenUI5中有两个不同的树控件。它们的比较非常类似于各自的表控件:sap.m.Tree与sap.m.Table共享一个公共基,因此它不支持虚拟滚动。这意味着它的所有行都出现在浏览器显示的HTML中(在"增长"模式下:所有行都显示到用户已经向下滚动的位置)。因此,对于同时显示有限数量的树节点(例如多达几百个)来说,这是一个很好的解决方案。除此之外,性能将受到影响sap.ui.table表另一方面,TreeTable是从有权势的人那里继承来的sap.ui.table表.Table,它可以处理大量的数据,因为它只为当前可见的行创建HTML—很少超过一到二十行。当用户滚动时,不交换行的HTML,只修改每行中显示的数据。因此,表(因此也是树表)并不关心数据中是否有1000或10亿行。

JSONModel是一个非常通用和流行的模型,因为它除了以流行的JSON格式提供数据之外没有其他要求。缺点是所有的数据都需要出现在客户端(至少通常是这样的——我们很快就会讲到这一点)。因此,对于像文件浏览器这样只应按需收集实际需要的数据并发送到浏览器的浏览器来说,这不是一个好的选择。遍历所有目录并发送所有数据将花费太多时间。

另一方面,ODataModel非常容易使用–基本上只需要服务URL就可以将表带到UI,它支持排序、过滤,当然还有分页等功能。所有相关的逻辑都发生在UI5端的ODataModel和相应的服务器实现的幕后。缺点是实现OData的服务器端库并非在所有平台上都可用。从头开始实现与OData完全兼容的服务器是一项艰巨的任务,因为协议相当复杂/强大。

幸运的是,实际上有两种方法可以走出这个困境:

因为支持这些参数和sap.ui.table表.TreeTable应用于其分页功能,让我们走第二条路。

选择这种方法的另一个原因是我很想了解分页是如何与树结构一起工作的。UI5树在JSONModel中的工作方式与ODataModel完全不同(差异可能封装在各自的*TreeBinding类中):

前者需要JSON数据中的树结构以及子列表可用的属性名的知识(本例中为"categories")。从这里可以很容易地理解这个结构是如何映射到UI的,以及动态加载是如何按需填充子树的。但由于OData只知道数据的平面列表,它如何处理树呢?

对于UI5客户端的成熟度,我关注的是OData v2(在sap.ui.model模型.odata.v2.ODataModel)。在那里,树结构基本上被编码为数据的一部分。最重要的是,每个数据元素必须知道树中其父节点的ID。虽然这些信息足以定义树结构,但可能为了更有效地处理,还需要更多的信息:每个节点都知道其层次结构级别(它在树中的位置有多深)以及它是叶节点还是子节点。当然,每个节点都需要一个其子节点可以引用的ID。这里可以看到一个例子。

数据中这些属性的名称不是预定义的,开源建站系统,它们可以在创建树控件绑定时进行配置(在一个名为treeAnnotationProperties的映射中),如我的示例应用程序的第17-20行所示。

虽然这看起来有些开销,你可以想象,动态填充这些信息非常容易。还要注意,OData使用的平面数据结构只是(虚拟)数据传输结构。不要求原始数据具有扁平结构

以文件浏览器为例:当然,原始数据是目录树和文件树,只是为了数据传输而虚拟地扁平化。当用户在浏览器中展开目录"A"的节点时,客户端请求所有父节点ID为"A"的文件,服务器端只需访问文件系统即可获得目录"A"的内容。对于每个包含的文件,检查它是树中的叶子还是另一个目录很简单。层次结构级别只是完整路径中的文件夹数。完成。很简单。

好的,然后我们还有分页相关的OData参数…$skip告诉服务器它感兴趣的第一个文件的位置,$top告诉应该发送多少个文件,从这个位置开始。假设我们在目录"A"中有两个文件"B"和"C",其中$skip=1和$top=1,服务器将不得不忽略一个文件("B"),而只发送一个文件("C")。在UI5中,$top的值通常在100左右,$skip会随着用户滚动列表而不断增加。

所以总的来说,会有这样的请求:

:2019/filebrowser/Files?$filter=ParentFileID%20eq%20%27some\u folder%27&$skip=0&$top=110&$inlinecount=allpages

分享到:
收藏
相关阅读