我在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)"。
我想,我只需要一点解释......
答案 0 :(得分:3)
oEvent
。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);
}
答案 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();
},