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

如何在Smart Table中绑定自定义筛选栏值

自定义筛选栏与Smart Table绑定(不使用Smart Filter)实现方案

问题背景

你已经实现了带Go按钮的自定义筛选栏,需要在点击Go时把筛选值绑定到Smart Table,并且不使用Smart Filter控件。原代码的问题在于直接调用bindRows会覆盖Smart Table原有绑定逻辑,而且没有处理空值筛选条件(空值会导致错误的过滤结果)。

优化后的XML代码

原XML配置可以保留,enableAutoBinding="true"会自动初始化绑定,我们只需要在点击Go时更新筛选条件即可:

<smartTable:SmartTable 
  id="smartTable_ResponsiveTable" 
  demandPopin="false" 
  tableType="Table" 
  editable="false" 
  entitySet="EntitySet" 
  showVariantManagement="true" 
  useVariantManagement="true" 
  useTablePersonalisation="true" 
  header="Request Pending My Action" 
  showRowCount="true" 
  useExportToExcel="true" 
  enableAutoBinding="true" 
  initialise="onInitialise" 
  persistencyKey="SmartTablePKey" 
  smartVariant="pageVariantId" 
  showFullScreenButton="true" 
  initiallyVisibleFields="Vin,Acind,Bukrs,Ekorg,Zzprimary,Zzscom1,Bunit,Lifnr,Name1,Status,Uname,Credat,Cretim">
</smartTable:SmartTable>

优化后的控制器代码

核心调整点:

  • 只收集有输入值的筛选条件,避免空值Filter干扰结果
  • 使用Smart Table底层绑定的filter方法,而非直接重新绑定行数据,保留Smart Table原有功能(分页、排序等)
onSearch: function() {
  const aFilters = [];
  const oView = this.getView();

  // 逐个判断输入框值,仅添加非空的筛选条件
  const sVin = oView.byId("Vin").getValue();
  if (sVin) {
    aFilters.push(new Filter("Vin", FilterOperator.EQ, sVin));
  }

  const sAcind = oView.byId("Acind").getValue();
  if (sAcind) {
    aFilters.push(new Filter("Acind", FilterOperator.EQ, sAcind));
  }

  const sBukrs = oView.byId("Bukrs").getValue();
  if (sBukrs) {
    aFilters.push(new Filter("Bukrs", FilterOperator.EQ, sBukrs));
  }

  const sEkorg = oView.byId("Ekorg").getValue();
  if (sEkorg) {
    aFilters.push(new Filter("Ekorg", FilterOperator.EQ, sEkorg));
  }

  const sZzprimary = oView.byId("Zzprimary").getValue();
  if (sZzprimary) {
    aFilters.push(new Filter("Zzprimary", FilterOperator.EQ, sZzprimary));
  }

  const sZzscom1 = oView.byId("Zzscom1").getValue();
  if (sZzscom1) {
    aFilters.push(new Filter("Zzscom1", FilterOperator.EQ, sZzscom1));
  }

  const sBunit = oView.byId("Bunit").getValue();
  if (sBunit) {
    aFilters.push(new Filter("Bunit", FilterOperator.EQ, sBunit));
  }

  const sLifnr = oView.byId("Lifnr").getValue();
  if (sLifnr) {
    aFilters.push(new Filter("Lifnr", FilterOperator.EQ, sLifnr));
  }

  const sName1 = oView.byId("Name1").getValue();
  if (sName1) {
    aFilters.push(new Filter("Name1", FilterOperator.EQ, sName1));
  }

  const sStatus = oView.byId("Status").getValue();
  if (sStatus) {
    aFilters.push(new Filter("Status", FilterOperator.EQ, sStatus));
  }

  const sUname = oView.byId("Uname").getValue();
  if (sUname) {
    aFilters.push(new Filter("Uname", FilterOperator.EQ, sUname));
  }

  const sCredat = oView.byId("Credat").getValue();
  if (sCredat) {
    aFilters.push(new Filter("Credat", FilterOperator.EQ, sCredat));
  }

  const sCretim = oView.byId("Cretim").getValue();
  if (sCretim) {
    aFilters.push(new Filter("Cretim", FilterOperator.EQ, sCretim));
  }

  // 获取Smart Table的行绑定,应用筛选条件
  const oSmartTable = oView.byId("smartTable_ResponsiveTable");
  const oTableBinding = oSmartTable.getTable().getBinding("rows");
  if (oTableBinding) {
    oTableBinding.filter(aFilters);
  }
}

额外注意事项

记得在控制器顶部引入Filter和FilterOperator类,否则代码会报错:

sap.ui.define([
  "sap/ui/core/mvc/Controller",
  "sap/ui/model/Filter",
  "sap/ui/model/FilterOperator"
], function(Controller, Filter, FilterOperator) {
  // 控制器其余代码
});

这种实现方式既完成了自定义筛选的需求,又保留了Smart Table的所有原生功能(如变体管理、导出Excel、分页等)。

内容的提问来源于stack exchange,提问作者Praveen Chan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 05:12:42