SAPUI5中TreeTable无数据时隐藏表格/列的实现方案咨询
解决sap.ui.table.TreeTable无数据时隐藏表格或列的问题
嘿,我明白你遇到的困扰了——sap.ui.table.TreeTable确实没直接把setVisible()方法摆到最显眼的地方(或者你可能找的时候走了点弯路),不过咱们有几种靠谱的方式实现你要的需求,分两种场景给你拆解:
一、无数据时隐藏整个TreeTable
最稳妥的思路是把TreeTable套进一个容器控件(比如Panel、VBox这类)里,给容器绑定visible属性,根据数据是否为空来控制显示隐藏。
方法1:用表达式绑定直接判断数据
如果你的树形数据根节点是/contracts/item,可以直接在XML里用表达式绑定判断数组长度,一步到位:
<VBox visible="{= ${/contracts/item}.length > 0 }"> <table:TreeTable id="TreeTableApproval" rows="{path:'/contracts',parameters: {arrayNames:['item']}}" selectionMode="None" ariaLabelledBy="title"> <!-- 你的列定义保持不变 --> <table:columns> <table:Column width="13rem"> <Label text="Approver ID"/> <table:template> <Text text="{yourApproverIdField}" wrapping="false"/> </table:template> </table:Column> <table:Column width="13rem"> <Label text="Name"/> <table:template> <Text text="{yourNameField}" wrapping="false"/> </table:template> </table:Column> </table:columns> </table:TreeTable> </VBox>
如果你的树形结构是多层嵌套,单纯判断根数组长度可能不够,这时候就得用控制器写递归逻辑来检查所有节点了。
方法2:控制器递归判断数据并控制容器
如果需要更复杂的判断(比如检查所有子节点是否有有效数据),可以在控制器里处理:
- 先给容器加个ID:
<VBox id="treeTableContainer"> - 在控制器的
onInit或数据加载完成的回调里加逻辑:
// 获取模型和容器 const oModel = this.getView().getModel(); const oContainer = this.getView().byId("treeTableContainer"); // 递归判断树形数据是否有实际内容 function hasData(oData) { if (!oData || !oData.item) return false; for (const oItem of oData.item) { // 检查当前节点是否有非空字段,或者子节点是否有数据 if (Object.keys(oItem).some(key => oItem[key] !== "") || hasData(oItem)) { return true; } } return false; } // 监听模型数据变化,确保数据更新时重新判断 oModel.attachPropertyChange(() => { const oContractData = oModel.getProperty("/contracts"); oContainer.setVisible(hasData(oContractData)); }); // 初始化时执行一次判断 const oContractData = oModel.getProperty("/contracts"); oContainer.setVisible(hasData(oContractData));
二、无数据时隐藏部分列
TreeTable的Column控件是支持setVisible()方法的,咱们可以在控制器里监听数据状态,动态控制列的显示:
具体步骤:
- 给需要控制的列加ID:
<table:Column id="colApproverId" width="13rem"> <Label text="Approver ID"/> <table:template> <Text text="{yourApproverIdField}" wrapping="false"/> </table:template> </table:Column> <table:Column id="colName" width="13rem"> <Label text="Name"/> <table:template> <Text text="{yourNameField}" wrapping="false"/> </table:template> </table:Column>
- 结合之前的
hasData方法,在控制器里控制列的显示:
const oColApproverId = this.getView().byId("colApproverId"); const oColName = this.getView().byId("colName"); const oContractData = oModel.getProperty("/contracts"); const bHasData = hasData(oContractData); // 无数据时隐藏指定列,有数据时恢复显示 oColApproverId.setVisible(bHasData); // 也可以只隐藏某一列,比如只隐藏Approver ID列 // oColApproverId.setVisible(bHasData);
补充小提示
其实sap.ui.table.TreeTable继承自sap.ui.core.Control,理论上是有setVisible()方法的,如果你用的是较新版本的UI5,可以直接试试:
this.getView().byId("TreeTableApproval").setVisible(false);
如果这个方法对你无效,大概率是版本兼容性问题,这时候用容器包裹的方式就更稳妥。
内容的提问来源于stack exchange,提问作者Beginner
相关产品推荐
相关产品推荐

