当前位置: 首页 > 知识库问答 >
问题:

Vaadin 23 具有 50 个或更多项目的虚拟列表会丢失 ClickListener 并且不会刷新

束涵涤
2023-03-14

上下文:在Vaadin 23.1.3应用程序中,有一个VirtualList,其中包含带有ClickListener的项目,用于刷新项目的内容。

方法:当 VirtualList 中有 3 个项目时,ClickListener 工作正常,在调用 callingRefreshItem 后,VirtualList 中的项目将被重新呈现。

这是我使用 id=“id2” 单击该项目 6 次后 VirtualList 的外观(计数器计数(等于 6)并且 LocalDateTime 按预期更新):

什么不起作用:当 VirtualList 中有 7000 个项目时,(a) ClickListener 在调用 refreshItem 后停止工作,(b) 应该刷新的项目(通过 refreshItem)不会刷新。

这是列表的外观,例如单击某些项目后有 7000 个项目(计数器未刷新且 LocalDateTime 未刷新):

法典:

@Route("sandbox")
public class SandboxView extends VerticalLayout {

private static class Item {
    String id;
    int clicked=0;
    public Item(String id) {
        super();
        this.id = id;
    }
    @Override
    public boolean equals(Object obj) {
        return this.id.equals(((Item)obj).id);
    }
}

public SandboxView() {
    int numberOfItems = 7000;
    VirtualList<Item> vlist = new VirtualList<>();
    List<Item> items = new ArrayList<>();
    for (int i=0;i<numberOfItems;i++) {
        items.add(new Item("id"+i));
    }
    ListDataProvider<Item> dataProvider = new ListDataProvider<Item>(items);
    vlist.setDataProvider(dataProvider);
    vlist.setRenderer(new ComponentRenderer<Div, Item>(item -> {
            Div div = new Div();
            div.addClickListener(e -> {item.clicked++;System.out.println(item.id + " clicked "+item.clicked+"x");dataProvider.refreshItem(item, true);});
            div.add(item.id+" "+item.clicked+" " +LocalDateTime.now());
            return div;
        }
    ));
    this.add(vlist);
}
}

进一步观察:

  • 此行为似乎从 VirtualList 中的 50 个项目开始。
  • 当我从损坏的项目滚动离开,然后向后滚动到损坏的项目时,该项目的值将刷新,ClickListener 存在,我可以使用它一次。然后我必须滚动离开并再次返回。
  • (更新)浏览器中有一个JavaScript错误:JS代码中发生了错误:“$0,$1,返回$0.$connector.updateData($1)”和以下消息:

问:如何在不丢失 ClickListener的情况下刷新大型 VirtualList 中的项目?

共有1个答案

杜辰龙
2023-03-14

在Vaadin 23.1.6中,这是固定的。

https://github.com/vaadin/flow-components/issues/3487#issuecomment-1191292376

 类似资料:
  • 我为序列分类(二进制)创建了一个LSTM网络,其中每个样本有25个时间步和4个特征。以下是我的keras网络拓扑: 上面,密集层之后的激活层使用softmax功能。我使用二进制交叉熵作为损失函数,Adam作为优化器来编译keras模型。使用batch_size=256、shuffle=True和validation_split=0.05对模型进行训练,以下是训练日志: 到目前为止,我还尝试使用了r

  • 问题内容: 我正在使用SQL数据库,我有一列名为“价格”。创建数据库后,将“价格”列设置为“我”,需要将其类型更改为不丢失数据库中的数据。这应该通过SQL脚本来完成 我想到了创建一个新列,将数据移到其中,删除旧列,然后重命名新创建的列。 有人可以帮我举个例子吗?在SQL中也有一个函数可以将字符串解析为十进制? 谢谢 问题答案: 您无需添加新列两次,只需在更新新列后删除旧列即可: 请注意,如果不是数

  • 我想分别使用python将多个excel文件与多个工作表合并。我不想丢失工作表中的任何格式。它应该复制所有工作表,只创建一个excel文件。 我只能合并第一张,而且所有的格式都丢失了。 这是我的代码:

  • 问题内容: 是否可以为列表理解中的每个项目返回2个(或更多)项目? 我想要的(示例): 应该回来 因此,可以替换以下代码块: 问题答案: 时间: 2.69210777094 3.13900787874 1.62461071932 25.5944058287 29.2623711793 25.7211849286

  • 我正在使用下面的内联脚本和update by query来更新弹性中的和时间戳。 问题是有些文档根本没有这个字段。所以当它遇到这样的doc时,它会以空指针表达式失败。有没有一种方法可以忽略这样的文档,并在找到它的地方更新它? {“error”:{“root_cause”:[{“type”:“script_exception”,“reason”:“运行时错误”,“script_stack”:[“ct

  • 本文向大家介绍python基础教程项目五之虚拟茶话会,包括了python基础教程项目五之虚拟茶话会的使用技巧和注意事项,需要的朋友参考一下 几乎在学习、使用任何一种编程语言的时候,关于socket的练习从来都不会少,尤其是会写一些局域网的通信的东西。所以书上的这个项目刚好可以练习一下socket编程。 这个练习的整体思路首先有一个聊天的服务器,这个服务器的功能主要是提供客户端socket的连接、存

  • 问题内容: 我已经坚持了好几个星期,而且我没有最模糊的想法出了什么问题。我已经很浪费了,因为我已经浪费了很多时间 我使用下面描述的数据模型(MySQL)。我已经通过反向工程(Eclipse / JBoss Tools)创建了hbm.xml和java类(请参见下面的示例)。 当我尝试保存推文,单词或事件时,我可以在日志消息中看到生成了pk值并且正确绑定了参数,但是没有任何内容写入数据库。(请参阅帖子

  • 虚拟列表可以用来渲染有大量数据的列表,并且不有有任何的性能问题。并且,它和所有的Framework7组件都是兼容的,包括搜索栏、无限滚动、下拉刷新、滑动删除和可排序列表。 虚拟列表的HTML结构 虚拟列表打HTML结构非常简单,他和常见的 列表 或者 多媒体列表只有一个区别,你必须把它的内容设置为空的。 <!-- Virtual List --> <div class="list-block vi