SAPUI5:如何筛选具有2个或更多值的数据

SAPUI5:如何筛选具有2个或更多值的数据,sapui5,Sapui5,我目前正在尝试SAPUI5中的一些东西,我实现了一个非常简单的搜索,如下所示: var filters = []; var query = evt.getParameter("query"); if (query && query.length > 0) { var nameFilter = new sap.ui.model.Filter("name", sap.ui.model.FilterOperator.Contains, qu

我目前正在尝试SAPUI5中的一些东西,我实现了一个非常简单的搜索,如下所示:

    var filters = [];
    var query = evt.getParameter("query");
    if (query && query.length > 0) {
        var nameFilter = new sap.ui.model.Filter("name", sap.ui.model.FilterOperator.Contains, query);

        filters.push(nameFilter);
    }

    var list = this.getView().byId("list");
    var binding = list.getBinding("items");
    binding.filter(filters);
现在我有以下问题:用这个逻辑,我可以只搜索,或者更确切地说,过滤一个人的名字。我还有一些附加字段,如年龄、性别等,我也想搜索年龄或性别。 所以我尝试创建第二个过滤器,比如“genderFilter”,它使用“gender”字段。在此之后,使用.push()方法将第二个筛选器添加到筛选器[]……但这不起作用

我已经试着看了文档,看了不同的例子,尝试了不同的方法——但我无能为力。有人能帮我解决这个问题吗

根据API

对于手动筛选,您应始终通过FilterType

如果您将代码更改为

 list.getBinding("items").filter(filters, sap.ui.model.FilterType.Application);
它应该会起作用


另请参见最底部。

对于每个条件,在
过滤器
数组中只有一个过滤器,它应该可以工作

var filters = [];
var sFilter;
var query = evt.getParameter("query");
if (query && query.length > 0) {

    if(query == "name" )
    {
       sFilter = new sap.ui.model.Filter("name", sap.ui.model.FilterOperator.Contains, query);
    }
    else if(query == "gender")
    {
       sFilter = new sap.ui.model.Filter("gender", sap.ui.model.FilterOperator.Contains, query);
    }
     //and so on...

    filters.push(sFilter);
}

var list = this.getView().byId("list");
var binding = list.getBinding("items");
binding.filter(filters);

我希望我把一切都做好了: 以下是将数据绑定到表时如何过滤多个列:

oTable.bindRows({
    path : "/modelData",
    filters:  [new sap.ui.model.Filter("severity", sap.ui.model.FilterOperator.EQ, '2'),
               new sap.ui.model.Filter("severity", sap.ui.model.FilterOperator.EQ, '3')]  
});

对于要求,此代码将起作用

var list = this.getView().byId("list");
var binding = list.getBinding("items");
if( !query ) {
    binding.filter( [] );
} 
else {
   binding.filter( [ new sap.ui.model.Filter([
      new sap.ui.model.Filter("name", sap.ui.model.FilterOperator.Contains, query ),
      new sap.ui.model.Filter("gender", sap.ui.model.FilterOperator.Contains, query )
   ],false)
]

我通过以下代码实现了这一点:-

var oFilter = new sap.ui.model.Filter("name",sap.ui.model.FilterOperator.Contains,searchString);
var oFilter1 = new sap.ui.model.Filter("ID",sap.ui.model.FilterOperator.Contains,searchString);
var comFil = new sap.ui.model.Filter([oFilter,oFilter1]);
var oList = sap.ui.getCore().byId("dealerList");
oList.getBinding("items").filter(comFil,sap.ui.model.FilterType.Application);

要组合多个过滤器,您必须按以下方式编写过滤器:

new sap.ui.model.Filter({
    filters: [
    new sap.ui.model.Filter(col1, , ,val),
    new sap.ui.model.Filter(col2, , ,val)
    ],
    and: false
})
资料来源:


然后,您可以使用或在多个列中进行筛选。

我必须同时使用这两个选项。所以最后这对我来说很有效

var oFilters = new sap.ui.model.Filter({
                filters: [
                    oFilter,
                    oFilter2
                ],
                and: false
            });
evt.getSource().getBinding("items").filter(oFilters, sap.ui.model.FilterType.Application);

谢谢你的帮助

绑定两个或多个筛选器的简单方法

var afilters = [];
var query = evt.getParameter("query");

afilters.push(new sap.ui.model.Filter("name", sap.ui.model.FilterOperator.Contains, query);
afilters.push(new sap.ui.model.Filter("age", sap.ui.model.FilterOperator.Contains, query);

var list = this.getView().byId("list");
var binding = list.getBinding("items");

binding.filter(new sap.ui.model.Filter({filters: afilters, and: true|false}));
var sQuery = oEvent.getParameter("value");
var oBinding = oEvent.getSource().getBinding("items");
oBinding.filter([
    new sap.ui.model.Filter("column A", sap.ui.model.FilterOperator.Contains, sQuery), 
    new sap.ui.model.Filter("column B", sap.ui.model.FilterOperator.Contains, sQuery)
]);

你好,谢谢你。但我还是有问题。这正在工作:var oFilter1=新过滤器(“名称”,FilterOperator.Contains,query);var list=this.getView().byId(“list”);list.getBinding(“items”).filter([oFilter1],FilterType.Application);但是使用第二个,它就不再工作了:var filter1=newfilter(“name”,FilterOperator.Contains,query);var filter2=新过滤器(“姓氏”,FilterOperator.Contains,query);var list=this.getView().byId(“list”);list.getBinding(“items”).filter([filter1,filter2],FilterType.Application);这里怎么了?谢谢,AlexOh该死的…我不能在8个小时内“问”这个问题,因为代码块和注释的格式都很糟糕..嗨,你能试试
.bindAggregation(“items”,“path:/”,filters:[oFilter1,oFilter2]})您好,我认为list.getBinding(“items”).filter([oFilter1,oFilter2]);正在工作,但使用此查询必须同时使用两个值(名称和姓氏)。有没有一种方法可以提供一个OR关系而不是and?谢谢,我不确定这是否可能,而且这甚至可能不是用户所期望的;使用多个筛选器比使用单个筛选器提供更多的结果…嘿,谢谢你的回答-但是我如何检测查询是名称还是性别?因为就像你写的那样,它不应该起作用——但我认为这个想法还不错。我只想用一个查询提供对多个字段的搜索。这个“query”变量中到底有什么,您是如何得到它的?这个“query”变量是searchfield的值,或者更确切地说是searchquery文本为什么不使用searchfield呢?使用类似于此处给出的内容,尝试过此方法,但它总是返回
$batch requests must be POST
错误,有什么想法吗?请解释一下您是如何得到此错误的完整场景。是在oData呼叫期间还是仅在设置过滤器期间。谢谢~我已经解决了!这是因为我在datetime类型的数据中使用了这个,多么愚蠢!我在这里描述了它:感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。A通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请在你的答案中添加一些解释,包括你所做的假设。这个答案与其他建议相同的答案有何不同?这是正确的!(尽管它似乎是在自己的结果之上应用sap.ui.model.Filter的。)