2014-09-29 1 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 случае TextField. Я не знаю, нужен ли мне OEvent.

Каков первый параметр «new sap.ui.model.Filter()»? Я думал, что это колонки, которые нужны. Где должен срабатывать новый фильтр? Я бы использовал «table.filter (allFilter)».

Я думаю, мне просто нужно немного объяснения ...

ответ

1
  1. Column1, Столбец2, Column3, column4 являются вяжущими путями ваших колонок.
  2. Для фильтра не нужен oEvent.
  3. Вы не можете позвонить по телефону table.filter(allFilter), table.filter(oEvent) - обработчик события и запускается, когда таблица фильтруется. Вы должны позвонить filter из sap.ui.model.ListBinding в таблицу фильтров.

Смотрите следующий код:

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

+0

Что вы имеете в виду, но это порождает ошибку? Ошибка в строке? – Allen

+0

Ошибка возникает в строке sap-ui-core.js 80. – Gorch

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 к тому, что вы назвали ваш TextField. Вам также может потребоваться изменить место размещения кнопки. Вот ссылка, которая помогла мне с моим решением 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

Спасибо Маркусу - показал мне дорогу. –

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