You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 16:10:11