2014-09-29 20 views
2

我在SAPUI5中遇到問題,我無法解決。如何在SAPUI5中的多列上過濾表格

我得到了一個包含文本框的工具欄。該字段的值用於過濾表格的所有列。 我知道,我必須創建多個custome過濾器。但我不知道,如何把所有的東西放在一起。因此,我創建這樣的方法:

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。

「new sap.ui.model.Filter()」的第一個參數是什麼?我認爲這是需要的列。 新過濾器必須在哪裏觸發?我會使用「table.filter(allFilter)」。

我想,我只是需要一點解釋...

回答

1
  1. 列1,列2,欄3,Column4是你列的結合路徑。
  2. 您不需要過濾器的oEvent
  3. 您不能撥打電話table.filter(allFilter)table.filter(oEvent)是一個事件處理程序,並在過濾表時觸發。您應該撥打sap.ui.model.ListBindingfilter來過濾表格。

請看下面的代碼:

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); 
} 
+0

它的工作原理。但我總是得到錯誤「爲過濾器定義的錯誤參數 - 」。對於列,我將綁定路徑更改爲綁定到它的屬性。你有線索,什麼是缺失/錯誤? – Gorch 2014-09-30 11:07:25

+0

你是什麼意思,它的工作,但拋出錯誤?在哪一行錯誤? – Allen 2014-09-30 14:04:46

+0

錯誤發生在sap-ui-core.js第80行。 – Gorch 2014-10-03 09:48:03

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

1

有一個模型的完整的節點上運行的謂詞的鏈接 我發現,你可以通過:路徑:假的oFilterInfo 例如

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

此信息可能會或可能不會有幫助,它涉及無任何擔保;)

+0

感謝Marcus - 向我展示了這條路。 – 2016-11-11 10:10:54

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(); 
},