1

我有 vaadin 网格,它可以从盒子中加载延迟数据,这很棒。但由于某些原因,我有自定义过滤器,我通过

CallbackDataProvider<> dataProvider.fetch(Query query)

offset查询对象具有按部分(和)加载的参数limit,因此我需要动态设置它(?)并以某种方式侦听网格滚动事件以在用户向下滚动时加载下一部分数据(?)

Grid.dataComunicator有字段Range pushRows,但没有公共方法来获取它。我所拥有的只是没有过滤数据的延迟加载网格或带有过滤数据的急切加载网格。

那么,有没有办法在 vaadin 网格元素中实现延迟加载过滤数据?

4

2 回答 2

0

ConfigurableFilterDataProvider<>好的,通过使用as wrapper over解决了问题CallbackDataProvider<>。所以,当我过滤表时,这个包装器会为所有查询添加过滤条件,并且像往常一样懒惰地加载数据。

于 2017-07-10T08:37:27.803 回答
0

我使用 vaadin 22 到达这里。答案可能与问题的上下文不同,但鉴于我到达这里,我怀疑其他人会。

要创建使用延迟加载并能够将过滤器注入查询的网格,请使用:

class SearchableGrid<E> {

Grid<E> entityGrid = new Grid<>();

private SearchableGrid(DaoDataProvider daoProvider)
    {
        var view = entityGrid.setItems(query ->
            {
                // add the filter to the query
                var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
                        getSearchField().getValue());

                return daoProvider.fetchFromBackEnd(q);
            });
        view.setItemCountCallback(query ->
            {
                // add the filter to the query
                var q = new Query<E, String>(query.getOffset(), query.getLimit(), query.getSortOrders(), null,
                        getSearchField().getValue());

                return daoProvider.sizeInBackEnd(q);

            });
    }

我已将这些方法打包到 BackEndDataProvider 中,因为同一个类可用作组合框的提供者。

public class DaoDataProvider<E extends CrudEntity>
        extends AbstractBackEndDataProvider<E, String>
{
    JpaBaseDao<E> dao;
    GetFilterBuilder<E> getFilterBuilder;

    public DaoDataProvider(JpaBaseDao<E> daoProvider, GetFilterBuilder<E> getFilterBuilder)
    {
        this.dao = daoProvider;
        this.getFilterBuilder = getFilterBuilder;
    }

    

    @Override
    public int sizeInBackEnd(Query<E, String> query)
    {
            var q = getFilterBuilder.builderFilter(query);
            return (int) q.count().intValue();
    }

    @Override
    public Stream<E> fetchFromBackEnd(Query<E, String> query)
    {

            var q = getFilterBuilder.builderFilter(query);
            q.startPosition(query.getOffset()).limit(query.getLimit());
            return q.getResultList().stream();
    }
}

filterBuilder 是您为后端数据提供者构建查询的地方。

于 2022-02-19T22:02:42.263 回答