0

我们正在更新我们的 Grid 表单以使用 LitTemplates 进行渲染。但是,即使状态的基础数据已更新,我们也遇到了复选框状态未更新的问题。以下代码演示了该问题:

        HorizontalLayout hlTest = new HorizontalLayout();
        List<String> selected = new ArrayList<>();
        Grid<String> testGrid =new Grid<>();
        testGrid.setWidth("250px");
        testGrid.setHeight("250px");
        List<String> dataList = new ArrayList<>(List.of("AAAAA", "BBBBB", "CCCCC", "DDDDD", "EEEEE"));
        ListDataProvider<String> dataProvider = new ListDataProvider<>(dataList);
        testGrid.setItems(dataProvider);

        String template = """
                    <vaadin-checkbox @click="${handleCheckClick}" ?checked="${item.rowSelected}"></vaadin-checkbox>
                    <div>${item.text}</div>
                """;

        LitRenderer<String> lit = LitRenderer.of(template);
        lit.withProperty("rowSelected", item -> {
            boolean rc = selected.contains(item);
            System.out.println("Item selected: " + item + " => " + rc);
            return rc;
        });
        lit.withProperty("text",item -> item);
        lit.withFunction("handleCheckClick", (item) -> {
            if(selected.contains(item))
                selected.remove(item);
            else
                selected.add(item);
        });
        testGrid.addColumn(lit);
        Button bSelect = new Button("Select");
        bSelect.addClickListener(buttonClickEvent -> {
            if(selected.size() > 0)
            {
                dataList.clear();
                dataList.addAll(selected);
                selected.clear();
                dataProvider.refreshAll();
            }
        });
        hlTest.add(testGrid, bSelect);

使用给定的网格,单击几个复选框,然后单击“选择”。列表减少为选定的行,但即使“选定”为空,复选框仍处于选中状态。“rowSelected”中的日志记录正确地返回了状态。

如果我删除列并重新添加到网格,那么所有内容都会正确显示。此外,如果我选择网格中的所有项目,那么选择也可以正常工作。

目前使用 Java17 和 Vaadin 22.0.6(也尝试过 23.0.0 beta3)。

谢谢。

4

1 回答 1

1

我认为您需要在更新时调用 dataProvider refresh

    lit.withFunction("handleCheckClick", (item) -> {
        if(selected.contains(item))
            selected.remove(item);
        else
            selected.add(item);
        testGrid().getDataProvider().refreshAll();
    });
于 2022-02-23T07:52:40.363 回答