如何在SAPUI5中的多个列上过滤表

时间:2014-09-29 15:00:12

标签: filtering sapui5

我在SAPUI5中遇到问题,我无法解决。

我有一个带有工具栏的表格,其中包含一个文本字段。该字段的值用于过滤表的所有列。 我知道,我必须创建多个自定义过滤器。但我不知道,如何将所有部分组合在一起。所以我创建了一个这样的方法:

filtering : function(value, oEvent) {
    var oFilter1 = new sap.ui.model.Filter(this.byId("Column1"), sap.ui.model.FilterOperator.Contains, value);
    var oFilter2 = new sap.ui.model.Filter(this.byId("Column2"), sap.ui.model.FilterOperator.Contains, value);
    var oFilter3 = new sap.ui.model.Filter(this.byId("Column3"), sap.ui.model.FilterOperator.Contains, value);
    var oFilter4 = new sap.ui.model.Filter(this.byId("Column4"), sap.ui.model.FilterOperator.Contains, value);
    var allFilter = new sap.ui.model.Filter([oFilter1, oFilter2, oFilter3, oFilter4], false); 
    var oBinding = oEvent.getSource().getBinding("items");
    oBinding.filter(allFilter);
}

我发现它here

从文本字段的liveChange事件调用该方法。我不知道我是否需要oEvent。

"新sap.ui.model.Filter()"的第一个参数是什么?我认为这是需要的专栏。 必须触发新过滤器的位置?我会使用" table.filter(allFilter)"。

我想,我只需要一点解释......

4 个答案:

答案 0 :(得分:3)

  1. Column1,Column2,Column3,Column4是列的绑定路径。
  2. 过滤器不需要oEvent
  3. 您无法调用table.filter(allFilter)table.filter(oEvent)是一个事件处理程序,并在过滤表时触发。您应该致电filter sap.ui.model.ListBinding来过滤表格。
  4. 请参阅以下代码:

    liveChange:function(oEvent) {
        var newValue = oEvent.getParameter("liveValue");
        filtering(newValue);
    },
    
    filtering : function(value) {
       var oFilter1 = new sap.ui.model.Filter("Column1", sap.ui.model.FilterOperator.Contains, value);
       var oFilter2 = new sap.ui.model.Filter("Column2", sap.ui.model.FilterOperator.Contains, value);
       var oFilter3 = new sap.ui.model.Filter("Column3", sap.ui.model.FilterOperator.Contains, value);
       var oFilter4 = new sap.ui.model.Filter("Column4", sap.ui.model.FilterOperator.Contains, value);
       var allFilter = new sap.ui.model.Filter([oFilter1, oFilter2, oFilter3, oFilter4], false); 
       var oBinding = oEvent.getSource().getBinding("items");
       oBinding.filter(allFilter);
    }
    

答案 1 :(得分:1)

抱歉迟到的反应,但我自己也想到了这一点。您需要一个按钮来处理文本字段。这是应该让它发挥作用的代码:

var oButton = new sap.ui.commons.Button({
    text: "find",
    styled: false,
    press: function () {
        var oFilter1 = new sap.ui.model.Filter("Column1",  sap.ui.model.FilterOperator.Contains, oInput.getValue());
        var oFilter2 = new sap.ui.model.Filter("Column2", sap.ui.model.FilterOperator.Contains, oInput.getValue());
        var oFilter3 = new sap.ui.model.Filter("Column3", sap.ui.model.FilterOperator.Contains, oInput.getValue());
        var oFilter4 = new sap.ui.model.Filter("Column4", sap.ui.model.FilterOperator.Contains, oInput.getValue());
        var allFilter = new sap.ui.model.Filter([oFilter1, oFilter2, oFilter3, oFilter4], oInput.getValue());
        oTable.getBinding("rows").filter(allFilter);
     }
}).placeAt("search");

您可能需要将oInput更改为您为文本字段命名的内容。您可能还需要更改按钮的位置。这是帮助我解决问题http://jsbin.com/xinucunidi/1/edit

的链接

答案 2 :(得分:1)

使谓词在模型的完整节点上运行 我发现你可以在oFilterInfo中传递:path:false e.g。

 new sap.ui.model.Filter({
        path:false,
        test: function (oNode) {
            console.log("In filter");
            console.log(oNode);
          return true; // result may depend on all properties of the node
      }})

此信息可能有用也可能没用,它没有任何保证;)

答案 3 :(得分:0)

您还可以将空白字符串传递给过滤器构造函数以访问整个节点。

以下是使用自定义过滤器功能过滤客户端+联系人的示例代码。这与建议一起使用,其中隐藏副本是有意义的。你可能不想用它来过滤表,除非你真的只想要一行。

    //Help function to handle the suggest events of the client search field ## handles duplicates ! ##
handleSuggestClient: function(oEvent){
    var sValue = oEvent.getParameter("suggestValue");
    var filters = [];
    var uniqueNames = [];
    filters = [new sap.ui.model.Filter([
            new sap.ui.model.Filter("", function(oNode) { // blank first param passes in entire node to test function
                var sVal = ((oNode.client + oNode.contact) || "").toUpperCase()
                if (uniqueNames.indexOf(sVal) === -1){
                    uniqueNames.push(sVal);
                    return sVal.indexOf(sValue.toUpperCase()) > -1;
                } else {
                    return false;
                }
            })
    ], false)];
    this.oSFClient.getBinding("suggestionItems").filter(filters);
    this.oSFClient.suggest();
},