向odata服务添加多重过滤器的问题

时间:2020-04-14 08:11:21

标签: filter odata sapui5

我有以下代码。我正在尝试从输入字段中读取PO的3个不同值,然后在列表中显示结果。程序对于单个输入来说运行良好,但是对于多个输入,我却遇到了问题。

var oV1 = this.getView().byId("oInput").getValue();
var oV2 = this.getView().byId("oInput1").getValue();
var oV3 = this.getView().byId("oInput2").getValue();                                     


var oFilter = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV1)];          
var oFilter1 = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV2)];
var oFilter2 = [new sap.ui.model.Filter("Ebeln", sap.ui.model.FilterOperator.Contains, oV3)];



var orFilter =new Array(new sap.ui.model.Filter({filters:[oFilter, oFilter1, oFilter2],and:true}));

   var oView1 = this.getView();
   var oTable = oView1.byId("myTable");
   var oBinding = oTable.getBinding("items");
   if(oV1 === "")
   {
       oBinding.filter( [] );
       oBinding.refresh(true);
   }
   else
   {
     oBinding.filter(orFilter);

在上面的oBinding.filter中,我收到以下错误。 多重过滤聚合中的过滤器必须是sap.ui.model.Filter的实例-

无法获取未定义或空引用的属性“替换”

请帮助。

2 个答案:

答案 0 :(得分:2)

您将过滤器包装在1000层数组中,这没有任何意义。

只需创建一个包含过滤器对象的单个数组:

// Filter, FilterOperator, and FilterType required from "sap/ui/model/*"
const aFilter = [
  new Filter("Ebeln", FilterOperator.Contains, sV1),
  new Filter("Ebeln", FilterOperator.Contains, sV2),
  new Filter("Ebeln", FilterOperator.Contains, sV3),
];
oListBinding.filter(aFilter, FilterType.Application);

我知道这不是代码审查,而是一些建议:

  • 没有人使用new Array()。只需使用[]

  • 您还使用了匈牙利表示法,但是每个变量名都以o开头。 o表示对象。您的某些变量不是对象,而是字符串(例如oV1,最好是sV1)或数组。

答案 1 :(得分:1)

对于filters聚合,sap.ui.model.Filter接受Filter[]。但是因为oFilter已经是Filter[],所以[oFilter, oFilter1, oFilter2]Filter[][],所以行不通。

要使其生效,只需从过滤器定义中删除周围的[],如下所示: var oFilter = new Filter(...);

相关问题