0

我相信我在 Vaadin Grid 中发现了一个可以用下面的代码复制的错误。

我想在更改网格时保存网格的排序顺序,然后在加载网格时恢复它。主要问题是GridSortOrder列表只是在排序侦听器中不断增加事件的大小,而不是替换排序列表。我相信这是 Vaadin 14-20 中的一个错误,因为它只有在我调用setColumnOrder()下面的重置方法时才会发生(删除该调用它会按预期工作)。换句话说,调用setColumnOrder()似乎GridSortOrder在应该替换它时将列表添加到排序侦听器中的事件。如果您grid.getSortOrder()在侦听器中这样做,这实际上也是如此,这意味着不仅是事件,而且还有网格受到损害。

这可以与下面的代码一致地复制。您首先需要通过单击列标题来更改描述列的排序顺序。然后只需单击重置按钮 5-10 次。完成此操作后,单击“描述”列标题以再次更改排序顺序。for 监听器将System.out显示列表的大小 20GridSortOrder而不是预期的 2 GridSortOrder。将一遍又一遍地复制列。

Grid<Car> grid = new Grid<>();

grid.addColumn(Car::getName)
        .setSortable(true)
        .setComparator(Car::getName)
        .setKey("Name")
        .setHeader("Name");
grid.addColumn(Car::getPrice)
        .setSortable(true)
        .setComparator(Car::getPrice)
        .setKey("Price")
        .setHeader("Price");
grid.addColumn(Car::getDescription)
        .setSortable(true)
        .setComparator(Car::getDescription)
        .setKey("Description")
        .setHeader("Description");

grid.setItems(listOfCars);

grid.setColumnReorderingAllowed(true);
grid.setMultiSort(true);

grid.addSortListener(event -> {
    System.out.println("Event: " + event.getSortOrder().size() + " : " + event.isFromClient());
    System.out.println("Grid: " + grid.getSortOrder().size() + " : " + event.isFromClient());
});

defaultSort(grid);

Button resetButton = new Button("Reset", click -> {
    System.out.println("Reset: " + grid.getSortOrder().size());
    defaultSort(grid);
    grid.setColumnOrder(
            grid.getColumnByKey("Name"),
            grid.getColumnByKey("Price"),
            grid.getColumnByKey("Description"));
});

add(grid, resetButton);

private void defaultSort(Grid grid) {
    grid.sort(List.of(
            new GridSortOrder<>(grid.getColumnByKey("Name"), SortDirection.ASCENDING),
            new GridSortOrder<>(grid.getColumnByKey("Price"), SortDirection.ASCENDING)
    ));
}

如果我grid.setColumnOrder()从上面删除,List<GridSortOrder>则按预期工作,并且在事件侦听器中是两个。特别有趣的是,event.getSortOrder().size()每次resetButton单击都会增加 2(但您只会在排序侦听器中看到它)。不管setColumnOrder()是在调用之前还是之后defaultSort()

考虑到这一点,如果您进行调试grid.setColumnOrder(),它似乎会调用updateClientSideSorterIndicators(sortOrder)这是我认为是原因的原因,并且是将其添加到GridSortOrder列表中的位置。话虽如此,我不确定如何从这里开始,以便在单击“重置”按钮时可以重置网格的设置。

仅供参考:这对我来说是个问题,因为我正在尝试将 Grid 的状态保存到数据库中,以便当用户重新加载屏幕(一个非常复杂的屏幕)时,他们的所有网格设置包括排序顺序、列顺序、等等都被保留了。然而,有了这个错误,就不可能保存排序顺序。

PS:这在 Vaadin 14 和 Vaadin 20 中似乎都是正确的。

4

0 回答 0