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

如何在弹窗打开前清空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.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 03:52:13