SAP UI5中sap.m.Tree控件JSON模型绑定树形结构构建求助
问题描述
- 需求:在SAP UI5应用中使用
sap.m.Tree控件,通过JSON模型绑定构建树形结构——以唯一roleid作为父节点,对应OData结果中的value作为子节点,但当前代码无法在界面显示数据,需修正实现方式。 - 现有数据:
- 唯一
roleid数组:["attribute", "role", "roleCollection"] - OData.results数据:
[ { roleid: "attribute", value: "Test attribute", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "attribute", value: "Test attribute2", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "role", value: "Test role", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "role", value: "Test role", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "RoleCollection", value: "Test RC1", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "roleCollection", value: "Test RC2", modifiedBy: "anonymous", projectid: "Test789" }, { roleid: "roleCollection", value: "Test RC3", modifiedBy: "anonymous", projectid: "Test789" } ]
- 唯一
- 当前Tree控件代码:
<Tree id="Tree" items="{path: 'rModel>/'} toggleOpenState="onPressTree"> <StandardTreeItem id="_IDTreeItem1" title="{rModel>roleid}" detailPress=""/> </Tree> - 尝试的构建代码:
const aUnique = [...new Set(oData.results.map(item => item.roleid))]; console.log("array Unique"+ aUnique); var b = oData.results, mainArry = [], obj = {}; for ( var i = 0; i < aUnique.length; i++ ) { mainArry.push(aUnique[i]); var temparry = []; for ( var e = 0; e < b.length; e++ ) { if (aUnique [i] === b[e].roleid ){ temparry.push(b[e].value); } } mainArry.push(temparry); temparry =""; obj.roleid = mainArry; }
解决方案
你当前构建的数据结构不符合sap.m.Tree的绑定要求——Tree需要层级化的对象数组(每个父节点包含自身标识+子节点数组),而非将父节点字符串与子数组平级存放。以下是修正步骤:
1. 正确构建树形结构数据
// 按roleid分组OData数据,统一大小写避免分组错误 const groupedData = oData.results.reduce((acc, item) => { const normalizedRoleId = item.roleid.toLowerCase(); if (!acc[normalizedRoleId]) { acc[normalizedRoleId] = []; } acc[normalizedRoleId].push({ value: item.value }); // 子节点存储value数据 return acc; }, {}); // 转换为Tree所需的层级结构数组 const treeData = Object.entries(groupedData).map(([roleid, children]) => { return { roleid: roleid, // 父节点标题字段 children: children // 子节点数组 }; }); // 绑定到JSON模型 const oJsonModel = new sap.ui.model.json.JSONModel(treeData); this.getView().setModel(oJsonModel, "rModel");
2. 修改Tree控件的绑定配置
Tree需要通过嵌套的StandardTreeItem绑定子节点,更新后的XML代码:
<Tree id="Tree" items="{path: 'rModel>/'} toggleOpenState="onPressTree"> <StandardTreeItem id="_IDTreeItem1" title="{rModel>roleid}" items="{path: 'rModel>children'}" > <!-- 子节点模板 --> <StandardTreeItem title="{rModel>value}" /> </StandardTreeItem> </Tree>
关键说明
- 父节点通过
items="{rModel>children}"指定子节点的绑定路径 - 嵌套的
StandardTreeItem用于渲染子节点的value内容 - 分组时统一
roleid大小写,解决原OData中RoleCollection与roleCollection的大小写不一致问题
内容的提问来源于stack exchange,提问作者Maha
相关产品推荐
相关产品推荐

