如何在 OpenUI5 table 列上设置过滤器以触发过滤
How to set filter on OpenUI5 table column so that it triggers filtering
我有一个 sap.ui.table.Table 绑定到 OData.V4 数据源。每列的filterProperty设置正确
有了这个,我可以使用单元格右键单击或在列 header 弹出菜单中成功设置过滤器值。这完全符合预期,因为更新后的请求会通过正确的过滤发送到 OData 源。
出于整体需求的原因,我希望将我所做的过滤器设置保存到JSON模型中:
var oTable = this.byId("table");
var aColumns = oTable.getColumns();
var columns={};
var settings=[];
var filtered=false;
for (var i = 0; i < aColumns.length; i++) {
if(aColumns[i].getFilterValue()) filtered=true;
settings.push({
"index": i,
"id":aColumns[i].getId(),
"sorted": aColumns[i].getSorted(),
"sortOrder": aColumns[i].getSortOrder(),
"filterValue": aColumns[i].getFilterValue(),
"filtered": aColumns[i].getFiltered(),
"visible": aColumns[i].getVisible()
});
}
columns.settings = settings;
columns.filtered = filtered;
然后用户可以尝试调用一组筛选和排序设置,其代码如下所示,其中 thisCrumb 包含已保存的设置:
var oTable = this.byId("table");
var columns = thisCrumb.columns;
if(columns){
if(columns.search )this.byId("searchField").setValue(columns.search);
for(var columnIndex in columns.settings){
var column = oTable.getColumns()[columns.settings[columnIndex].index ]
column.setFilterValue(columns.settings[columnIndex].filterValue );
oTable.filter(column, columns.settings[columnIndex].filterValue);
column.setFiltered(columns.settings[columnIndex].filtered );
column.setSortOrder(columns.settings[columnIndex].sortOrder );
column.setSorted(columns.settings[columnIndex].sorted );
column.setVisible(columns.settings[columnIndex].visible);
}
}else{
this.clearAllFilters();
this.clearAllSorts();
}
虽然值显示在 table 上,例如在列 header 上设置了过滤器图标,并且还设置了过滤器值,但用于刷新数据的 OData 查询确实不包括过滤器值。
API 文档建议应该为每一列调用 sap.ui.table.Table.filter 方法,我已经这样做了(如上所述)但没有成功:
oTable.filter(column, columns.settings[columnIndex].filterValue);
如果我以交互方式使用列 header 上下文菜单和 'touch' 过滤器值,table 会刷新,包括相应的过滤器。
我希望能够恢复一组已保存的过滤器 and/or 排序值,将它们应用于每一列,然后刷新 Table 以显示过滤后的集合
好的所以我最终解决了这个问题。在上面的示例中,我假设我正在操纵将应用于模型端点的过滤器。不是这种情况。我在这个示例代码中所做的只是操纵显示在 Table、下拉框等
上的过滤器
要保存并重新应用过滤器,我必须访问 table 上的行绑定:
columns.aFilters = oTable.getBinding("rows").aFilters;
但是我仍然遇到问题,因为有两个过滤器:控件和应用程序绑定。申请筛选条件如下:
columns.aApplicationFilters = oTable.getBinding("rows").aApplicationFilters;
然后当我select一组不同的过滤器时,它们需要绑定到行聚合,如下所示:
oTable.bindAggregation("rows", {
path: sObjectPath,
parameters: expand,
filters:filters,
sorter:sorter
});
其中过滤器是
columns.aFilters or columns.aApplicationFilters
我有一个 sap.ui.table.Table 绑定到 OData.V4 数据源。每列的filterProperty设置正确
有了这个,我可以使用单元格右键单击或在列 header 弹出菜单中成功设置过滤器值。这完全符合预期,因为更新后的请求会通过正确的过滤发送到 OData 源。
出于整体需求的原因,我希望将我所做的过滤器设置保存到JSON模型中:
var oTable = this.byId("table");
var aColumns = oTable.getColumns();
var columns={};
var settings=[];
var filtered=false;
for (var i = 0; i < aColumns.length; i++) {
if(aColumns[i].getFilterValue()) filtered=true;
settings.push({
"index": i,
"id":aColumns[i].getId(),
"sorted": aColumns[i].getSorted(),
"sortOrder": aColumns[i].getSortOrder(),
"filterValue": aColumns[i].getFilterValue(),
"filtered": aColumns[i].getFiltered(),
"visible": aColumns[i].getVisible()
});
}
columns.settings = settings;
columns.filtered = filtered;
然后用户可以尝试调用一组筛选和排序设置,其代码如下所示,其中 thisCrumb 包含已保存的设置:
var oTable = this.byId("table");
var columns = thisCrumb.columns;
if(columns){
if(columns.search )this.byId("searchField").setValue(columns.search);
for(var columnIndex in columns.settings){
var column = oTable.getColumns()[columns.settings[columnIndex].index ]
column.setFilterValue(columns.settings[columnIndex].filterValue );
oTable.filter(column, columns.settings[columnIndex].filterValue);
column.setFiltered(columns.settings[columnIndex].filtered );
column.setSortOrder(columns.settings[columnIndex].sortOrder );
column.setSorted(columns.settings[columnIndex].sorted );
column.setVisible(columns.settings[columnIndex].visible);
}
}else{
this.clearAllFilters();
this.clearAllSorts();
}
虽然值显示在 table 上,例如在列 header 上设置了过滤器图标,并且还设置了过滤器值,但用于刷新数据的 OData 查询确实不包括过滤器值。
API 文档建议应该为每一列调用 sap.ui.table.Table.filter 方法,我已经这样做了(如上所述)但没有成功:
oTable.filter(column, columns.settings[columnIndex].filterValue);
如果我以交互方式使用列 header 上下文菜单和 'touch' 过滤器值,table 会刷新,包括相应的过滤器。
我希望能够恢复一组已保存的过滤器 and/or 排序值,将它们应用于每一列,然后刷新 Table 以显示过滤后的集合
好的所以我最终解决了这个问题。在上面的示例中,我假设我正在操纵将应用于模型端点的过滤器。不是这种情况。我在这个示例代码中所做的只是操纵显示在 Table、下拉框等
上的过滤器要保存并重新应用过滤器,我必须访问 table 上的行绑定:
columns.aFilters = oTable.getBinding("rows").aFilters;
但是我仍然遇到问题,因为有两个过滤器:控件和应用程序绑定。申请筛选条件如下:
columns.aApplicationFilters = oTable.getBinding("rows").aApplicationFilters;
然后当我select一组不同的过滤器时,它们需要绑定到行聚合,如下所示:
oTable.bindAggregation("rows", { path: sObjectPath, parameters: expand, filters:filters, sorter:sorter });
其中过滤器是
columns.aFilters or columns.aApplicationFilters