【问题标题】:SAPUI5: How to filter data with 2 or more valuesSAPUI5:如何过滤具有 2 个或更多值的数据
【发布时间】:2014-06-01 11:27:23
【问题描述】:

我目前正在尝试使用 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, query);

        filters.push(nameFilter);
    }

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

现在我有以下问题:使用这种逻辑,我可以按人名搜索,或者更确切地说进行过滤。我还有一些额外的字段,如年龄、性别等,我也想搜索年龄或性别。 所以我尝试创建第二个过滤器,例如“genderFilter”,它使用“gender”字段。在此之后使用 .push() 方法将第二个过滤器添加到过滤器 [].. 但这不起作用。

我已经尝试过查看文档,查看过不同的示例,尝试过不同的方式 - 但我无能为力。有人可以帮我解决这个问题吗?

【问题讨论】:

    标签: sapui5


    【解决方案1】:

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

    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)
    ]
    

    【讨论】:

    • 试过这个,但它总是返回一个$batch requests must be POST 错误,知道吗?
    • 你会解释你是如何得到这个错误的完整场景。是在 oData 调用期间还是仅在设置过滤器期间。
    • 谢谢~我已经解决了!这是因为我在日期时间类型的数据中使用了它,多么愚蠢!我在这里描述了它:stackoverflow.com/questions/41736210/…
    【解决方案2】:

    根据 API

    对于手动过滤,您应该始终传递 FilterType

    如果您将代码更改为

     list.getBinding("items").filter(filters, sap.ui.model.FilterType.Application);
    

    它应该可以工作。

    另请参阅最底部的https://openui5.hana.ondemand.com/docs/guide/BindingAggregations.html

    【讨论】:

    • 您好,谢谢您。但我仍然有问题。这是有效的: var oFilter1 = new Filter("name", FilterOperator.Contains, query); var list = this.getView().byId("list"); list.getBinding("items").filter([oFilter1], FilterType.Application);但是有了第二个,它不再起作用了: var filter1 = new Filter("name", FilterOperator.Contains, query); var filter2 = new Filter("姓氏", FilterOperator.Contains, query); var list = this.getView().byId("list"); list.getBinding("items").filter([filter1, filter2], FilterType.Application);这里有什么问题?谢谢,亚历克斯
    • 哦该死的......我不能在 8 小时内“问”这个问题以获得代码块,并且评论的格式非常糟糕..
    • 嗨,你可以试试.bindAggregation("items", { path : "/", filters : [oFilter1, oFilter2] });
    • 嗨,我认为 list.getBinding("items").filter([ oFilter1, oFilter2 ]);现在正在工作,但是查询必须同时包含两个值(姓名和姓氏)。有没有办法提供 OR 关系而不提供 AND ?谢谢,亚历克斯
    • 不确定这是否可能,甚至可能不是用户所期望的;与拥有单个过滤器相比,拥有多个过滤器提供更多个结果...
    【解决方案3】:

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

    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);
    

    【讨论】:

      【解决方案4】:

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

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

      来源:https://sapui5.hana.ondemand.com/docs/api/symbols/sap.ui.model.Filter.html#constructor

      然后您可以使用 OR 过滤多个列。

      【讨论】:

      • 这是正确的! (尽管在它自己的结果之上应用 sap.ui.model.Filter 似乎有些连贯。)
      【解决方案5】:

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

      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);
      

      【讨论】:

      • 嘿,谢谢您的回答 - 但是我如何检测查询是姓名还是性别?因为就像你写的那样,它不应该工作 - 但我认为这个想法还不错。我只想通过一个查询提供对多个字段的搜索。
      • 这个“查询”变量中到底有什么,你是如何得到它的?
      • “查询”变量是搜索字段的值 - 或者更确切地说是搜索查询文本
      • 为什么不使用搜索字段呢?使用类似于这里给出的东西,openui5.hana.ondemand.com/#test-resources/sap/ui/commons/…
      【解决方案6】:

      我希望我做对了: 以下是在将数据绑定到表时过滤多个列的方法:

      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')]  
      });
      

      【讨论】:

        【解决方案7】:

        我不得不同时使用这两个。所以最后这对我有用。

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

        感谢您的帮助!

        【讨论】:

          【解决方案8】:
          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}));
          

          【讨论】:

          • 感谢您提供此代码 sn-p,它可能会提供一些有限的即时帮助。 proper explanation would greatly improve its long-term value 通过展示为什么这是一个很好的解决问题的方法,并将使其对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
          • 这个答案与其他相同的答案有何不同?
          【解决方案9】:

          绑定两个或多个过滤器的简单方法。

          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)
          ]);
          

          【讨论】:

            猜你喜欢
            • 2016-06-26
            • 2020-08-25
            • 1970-01-01
            • 2022-01-21
            • 1970-01-01
            • 1970-01-01
            • 2015-07-14
            • 2012-03-12
            • 2022-08-19
            相关资源
            最近更新 更多