Ag Grid 表格树 Vue Data Grid: Tree Data

本文详细介绍了VueDataGrid中如何使用TreeData模式处理具有层级关系的数据。内容涵盖启用TreeData模式、实现getDataPath回调以指定数据层次结构、配置自动和自定义列组、展示组织层次结构示例、填充组、聚合、过滤、文件浏览器例子以及选择和子计数功能。此外,还讨论了树状数据与透视和行分组的区别以及过滤聚合的影响。
摘要由CSDN通过智能技术生成

前往官网查看:Vue Data Grid: Tree Data

使用树形数据来显示具有父/子关系的数据,其中的父/子关系是作为数据的一部分提供的。例如,一个文件夹可以包含零个或多个文件和其他文件夹。

在介绍更高级的用例之前,本节介绍使用树数据的简单方法。


Tree Data 模式

为了将网格设置为与树数据一起使用,只需使用以下命令通过网格选项启用树数据模式:

<ag-grid-vue
    :treeData="treeData"
    /* other grid options ... */>
</ag-grid-vue>

this.treeData = true;

提供 Tree Data

当向网格提供树状数据时,你要实现gridOptions.getDataPath(data)回调,告诉网格每一行的层次结构。回调会返回一个string[],每个元素都指定了树的一个层次。下面是两个以不同方式呈现层次结构的例子。

  • getDataPath: GetDataPath
    • 当treeData = true时,在处理树状数据时使用的回调。
getDataPath: GetDataPath<TData>;

interface GetDataPath<TData = any> {
    (data: TData) : string[]
}
// 层次结构示例,Malcolm 是孩子或 Erica
// + Erica
//   - Malcolm

// ############
// Example #1 - 数据中的层次结构已经是一个字符串数组
// ############
const rowData = [
    { orgHierarchy: ['Erica'], jobTitle: "CEO", employmentType: "Permanent" },
    { orgHierarchy: ['Erica', 'Malcolm'], jobTitle: "VP", employmentType: "Permanent" }
    ...
]
// 只需返回层次结构,不需要转换
getDataPath: data => {
    return data.orgHierarchy;
}

// ############
// Example #2 - 层次结构是一个路径字符串,需要转换
// ############
const rowData = [
    { path: "Erica", jobTitle: "CEO", employmentType: "Permanent" },
    { path: "Erica/Malcolm", jobTitle: "VP", employmentType: "Permanent" }
    ...
]
// 回调将例如 "Erica/Malcolm"转换为["Erica", "Malcolm"]
getDataPath: data => {
    return data.path.split('/'); // path: "Erica/Malcolm"
}

配置组列

有两种配置组列的方法:

  • Auto Column Group: 这是在树数据模式下由网格自动选择的,但是您可以覆盖默认值。
  • Custom Column Group: 您可以提供自己的自定义列组定义,这样可以更好地控制组列的显示方式。

Auto Column Group

当网格使用树数据时,不需要明确指定组列,因为网格将使用自动组列(Auto Group Column)。 但是,您可能想要覆盖一些默认值,如下所示:

<ag-grid-vue
    :autoGroupColumnDef="autoGroupColumnDef"
    /* other grid options ... */>
</ag-grid-vue>

this.autoGroupColumnDef = {
    headerName: "My Group",
    width: 300,
    cellRendererParams: {
        suppressCount: true // 是否禁用标题行菜单
    }
};

Custom Column Group

如上所述,提供您自己的自定义列组的优点是可以让您完全控制列组的显示,但是它不如使用默认的自动列组方便。

一个显著的区别是,整个dataPath数组将作为一个值被提供,而不仅仅是当前节点的值。

更多细节见自定义组列(Custom Group Columns)

对于树形数据,不可能像对行分组那样有多个组的显示列。当做树状数据时,你应该只有一列来显示组。


示例:组织层次结构

下面的例子结合了上述所有步骤,展示了一个简化的组织层次结构。

前往查看示例:Org Hierarchy


填充组

如果组级别不需要数据,则不必在路径中包含每个级别的条目,如下所示:

// 提供的所有路径级别
const rowData = [
    { filePath: ['Documents'] },
    { filePath: ['Documents', 'txt'] },
    { filePath: ['Documents', 'txt', 'notes.txt'], dateModified: "21 May 2017, 13:50", size: "14 KB" }
    ...
]

// 只提供叶子级别
const rowData = [
    { filePath: ['Documents', 'txt', 'notes.txt'], dateModified: "21 May 2017, 13:50", size: "14 KB" }
    ...
]

上面的第二个变量省略了’Documents’和’txt’节点的行数据条目,在这种情况下,网格将为这些节点创建填充组。

下面这个例子包含列Group Type,以突出哪些节点是在行数据中提供的,哪些是由网格填充生成的。

前往查看示例:Filler Nodes

由于Filler Groups是由网格生成的,因此它们不会包含RowNode上的数据属性。 如果你想为每个组提供一个id,即使在组级别没有显示数据时,或者如果你需要过滤/排序填充节点,这可能会有所限制。 为了过滤/排序可用,请提供所有节点作为数据集中的真实节点,而不是使用填充节点。


Tree Data 聚合(合集、汇总)

当使用树形数据时,用聚合函数定义的列将总是对组节点进行聚合。这意味着任何提供的组数据将被忽略,而支持聚合的值。

但是,如果没有子节点可以聚合,它将默认为行数据中提供的值。

下面的文件浏览器例子展示了对size列的聚合。

此外,你还可以参考聚合( Aggregation)部分的更多细节。


Tree Data 过滤

由于树状数据具有父/子关系,默认情况下,当父节点通过过滤器时,所有的子节点都会被包括在内,由于过滤是在所有组的层面上进行的,因此在以下情况下将包含一个组:

  1. 它有任何通过过滤器的子节点,或者
  2. 它的数据通过了过滤器

要覆盖这一行为以使用常规过滤,请启用以下网格选项属性:

<ag-grid-vue
    :excludeChildrenWhenTreeDataFiltering="true"
    /* other grid options ... */>
</ag-grid-vue>

另外请要注意,设置过滤器(Set Filter)将包含组层次结构中每一级的所有唯一值的列表。下面的文件浏览器例子演示了设置过滤器如何与树形数据一起工作。


文件浏览器例子

以下示例提供了一个更复杂的示例,其中包括聚合和过滤:

  • Add New Group按钮 - 将在Music下添加一个新的组。
  • Move Selected to stuff按钮 - 移动到stuff文件夹中。
  • Remove Selected按钮 - 将删除所选组和它的子组。
  • Files列 过滤 - 你可以在整个文件树上过滤组和叶子节点的名称。
  • Size列 聚合 - 当您将选定的项目移动到stuff中时,您会注意到更新的文件夹大小。

前往查看示例:File Browser


树状数据的透视和行分组

在使用树状数据时,不可能进行透视或行分组。这意味着所有与透视(如colDef.pivot,或工具面板中的透视)和行分组(如colDef.rowGroup,或工具面板中的行分组)相关的功能将被禁用。


子计数

如果您要显示组的子计数,那么子计数就是所有子和孙子的计数。这与行分组(Row Grouping)不同,行分组只计算叶子层,在树状数据中,所有组的孩子也被计算在内。


选择

要启用选择功能,请将gridOptions.rowSelection设置为"single"单选或"multiple"多选,和平常一样。但是有一些限制需要注意。

复选框与点击选择

树数据支持单击选择。 但是,当您显示树数据时,单击行进行选择会造成混淆,因为鼠标单击也用于扩展/收缩行。 出于这个原因,我们建议不要使用单击选择,而是使用复选框选择。

<ag-grid-vue
    :suppressRowClickSelection="suppressRowClickSelection"
    :autoGroupColumnDef="autoGroupColumnDef"
    /* other grid options ... */>
</ag-grid-vue>

// 设置为true: 禁用单击时选择行
this.suppressRowClickSelection = true;

// 在组列上使用复选框
this.autoGroupColumnDef = {
    cellRendererParams: {
        checkbox: true,
    }
};

组 选择

如果填充组被移动,填充组不会保持其选择状态。例如,如果你有A->B->C组,其中C是唯一提供的行(所以网格为你创建了A和B组),然后你把补丁改为D->B->C,B组将不会保持它的选择。

示例:选择组和子项

下面是一个演示属性groupSelectsChildren与树数据一起使用的例子。

在下面的示例中,请注意以下事项:

  • 选择所有子行将选择父行
  • 只选择某行的部分子代,会将其标记为部分选择
  • 选择一行,然后在按住 shift 键的同时选择另一行将选择两行之间的所有行
  • 选择带有子行的行也将选择所有该行的子行

前往查看示例:Group Selects Children


过滤聚合

如果聚合和过滤器在树状数据中被激活,有一件事需要关注。那就是聚合值会随着过滤器的应用而改变,这反过来会影响过滤器的结果。

当不使用树状数据过滤时,这不是一个问题,因为在正常的行分组(Row Grouping)中,组的行(聚集的地方)不被过滤,只有叶子的行被过滤。

但是对于树形数据来说,所有的行都会被过滤,因为所有的行都是组(叶子行只是一个没有孩子的组)。由于这个原因,如果你对一个有聚合功能的列进行过滤,在应用过滤器时,聚合值将是一个移动的目标。

要阻止聚合成为一个移动的目标,你需要设置网格属性suppressAggFilteredOnly=true。这在聚合一节中有解释。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
treegrid插件 当前选中的行: var config = { id: "tg1", width: "800", renderTo: "div1", headerAlign: "left", headerHeight: "30", dataAlign: "left", indentation: "20", folderOpenIcon: "images/folderOpen.gif", folderCloseIcon: "images/folderClose.gif", defaultLeafIcon: "images/defaultLeaf.gif", hoverRowBackground: "false", folderColumnIndex: "1", itemClick: "itemClickEvent", columns:[ {headerText: "", headerAlign: "center", dataAlign: "center", width: "20", handler: "customCheckBox"}, {headerText: "名称", dataField: "name", headerAlign: "center", handler: "customOrgName"}, {headerText: "拼音码", dataField: "code", headerAlign: "center", dataAlign: "center", width: "100"}, {headerText: "负责人", dataField: "assignee", headerAlign: "center", dataAlign: "center", width: "100"}, {headerText: "查看", headerAlign: "center", dataAlign: "center", width: "50", handler: "customLook"} ], data:[ {name: "城区分公司", code: "CQ", assignee: "", children:[ {name: "城区卡品分销中心"}, {name: "先锋服务厅", children:[ {name: "chlid1"}, {name: "chlid2"}, {name: "chlid3", children: [ {name: "chlid3-1"}, {name: "chlid3-2"}, {name: "chlid3-3"}, {name: "chlid3-4"} ]} ]}, {name: "半环服务厅"} ]}, {name: "清新分公司", code: "QX", assignee: "", children:[]}, {name: "英德分公司", code: "YD", assignee: "", children:[]}, {name: "佛冈分公司", code: "FG", assignee: "", children:[]} ] }; /* 单击数据行后触发该事件 id:行的id index:行的索引。 data:json格式的行数据对象。 */ function itemClickEvent(id, index, data){ window.location.href="ads"; } /* 通过指定的方法来自定义栏数据 */ function customCheckBox(row, col){ return ""; } function customOrgName(row, col){ var name = row[col.dataField] || ""; return name; } function customLook(row, col){ return "查看"; } //创建一个组件对象 var treeGrid = new TreeGrid(config); treeGrid.show(); /* 展开、关闭所有节点。 isOpen=Y表示展开,isOpen=N表示关闭 */ function expandAll(isOpen){ treeGrid.expandAll(isOpen); } /* 取得当前选中的行,方法返回TreeGridItem对象 */ function selectedItem(){ var treeGridItem = treeGrid.getSelectedItem(); if(treeGridItem!=null){ //获取数据行属性值 //alert(treeGridItem.id + ", " + treeGridItem.index + ", " + treeGridItem.data.name); //获取父数据行 var parent = treeGridItem.getParent(); if(parent!=null){ //jQuery("#currentRow").val(parent.data.name); } //获取子数据行集 var children = treeGridItem.getChildren(); if(children!=null && children.length>0){ jQuery("#currentRow").val(children[0].data.name); } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值