如何在 OpenUI5 表列上设置过滤器以触发过滤

Posted

技术标签:

【中文标题】如何在 OpenUI5 表列上设置过滤器以触发过滤【英文标题】:How to set filter on OpenUI5 table column so that it triggers filtering 【发布时间】:2019-09-05 11:02:45 【问题描述】:

我有一个绑定到 OData.V4 数据源的 sap.ui.table.Table。每列的filterProperty设置正确。

有了这个,我可以成功地设置一个过滤器值,或者使用单元格右键单击或在列标题弹出菜单中。这完全符合预期,因为更新的请求会通过正确的过滤发送到 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();
                   

虽然值显示在表格上,例如在列标题上设置了过滤器图标,并且还设置了过滤器值,但刷新数据的 OData 查询不包括过滤器值。

API 文档建议应该为每一列调用 sap.ui.table.Table.filter 方法,我已经完成了(如上所述)但没有成功:

oTable.filter(column, columns.settings[columnIndex].filterValue);

如果我以交互方式使用列标题上下文菜单并“触摸”过滤器值,则表格会刷新,包括相应的过滤器。

我希望能够恢复一组已保存的过滤器和/或排序值,将它们应用于每一列,然后刷新表格以显示过滤集

【问题讨论】:

【参考方案1】:

好的,所以我最终解决了这个问题。在上面的示例中,我假设我正在操作将应用于模型端点的过滤器。不是这种情况。我在这个示例代码中所做的只是操作表格、下拉框等中显示的过滤器。

要保存和重新应用过滤器,我必须访问表格上的行绑定:

columns.aFilters = oTable.getBinding("rows").aFilters;

但是我仍然遇到问题,因为有两个过滤器:控件和应用程序绑定。应用过滤器如下:

columns.aApplicationFilters = oTable.getBinding("rows").aApplicationFilters;

然后当我选择一组不同的过滤器时,它们需要绑定到行聚合,如下所示:

          oTable.bindAggregation("rows", 
                path: sObjectPath,
                parameters: expand,
                filters:filters,
                sorter:sorter
            );

其中过滤器是任一

columns.aFilters 或 columns.aApplicationFilters

【讨论】:

以上是关于如何在 OpenUI5 表列上设置过滤器以触发过滤的主要内容,如果未能解决你的问题,请参考以下文章

在一列上设置过滤器和提供的过滤器 - Ag-Grid

MySQL - 根据更新其他表列值触发更新列值

如何在材料表reactjs的表列外显示选择过滤器

特定列上的脚注过滤器

如何在不同的列上做不同的过滤器

使用 LINQ to SQL 时如何指定/过滤应填充哪些表列?