如何在弹窗打开前清空FilterBar?getAllFilterItems返回Controls集合为空
解决FilterBar清空时控件获取不到的问题
我之前也碰到过类似的困扰——每次打开对话框想清空FilterBar,结果用getAllFilterItems()拿到的项里,Controls聚合是空的根本没法操作。别慌,咱们不用依赖内部的_retrieveCurrentSelectionSet方法,用官方API就能完美解决:
方案1:直接调用FilterBar的官方clear()方法
你的FilterBar已经绑定了clear事件,其实直接调用FilterBar实例的clear()方法就能触发清空逻辑,这是最规范的做法:
// 假设你的FilterBar有id="myFilterBar" const oFilterBar = this.byId("myFilterBar"); oFilterBar.clear(); // 这会自动触发你绑定的onClear事件
如果你的onClear事件还没完善清空逻辑,可以在里面这么写,确保能拿到所有控件:
onClear: function(oEvent) { const oFilterBar = oEvent.getSource(); // 获取所有FilterGroupItem(这是你在XML里定义的带控件的项) oFilterBar.getFilterGroupItems().forEach(oGroupItem => { const oControl = oGroupItem.getControl(); if (oControl) { // 根据控件类型做清空处理 switch(oControl.getMetadata().getName()) { case "sap.m.Input": oControl.setValue(""); break; case "sap.m.Select": oControl.setSelectedKey(""); break; case "sap.m.DatePicker": oControl.setDateValue(null); break; // 其他控件类型按需添加 } } }); }
方案2:手动遍历FilterGroupItem获取控件
如果不想触发clear事件,也可以直接遍历getFilterGroupItems()拿到所有控件并清空,逻辑和上面onClear里的一致:
const oFilterBar = this.byId("myFilterBar"); oFilterBar.getFilterGroupItems().forEach(oGroupItem => { const oControl = oGroupItem.getControl(); if (oControl) { // 清空对应控件的值 if (oControl.isA("sap.m.Input")) { oControl.setValue(""); } } });
为什么getAllFilterItems()拿不到控件?
这里要说明下:getAllFilterItems()返回的是用于过滤条件的抽象项,不是你在XML里定义的带控件的FilterGroupItem,所以它的Controls聚合是空的很正常。而getFilterGroupItems()才是直接获取你定义的那些带控件的分组项,能直接拿到对应的输入控件。
⚠️ 重要提醒:千万不要用_retrieveCurrentSelectionSet这种以下划线开头的内部方法,SAP的内部API不对外兼容,UI5版本升级后很可能失效,用官方API才是长久之计。
内容的提问来源于stack exchange,提问作者I.B.N.
相关产品推荐
相关产品推荐

