首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >显示复杂对象列表和发出事件int vaadin14的最佳方法

显示复杂对象列表和发出事件int vaadin14的最佳方法
EN

Stack Overflow用户
提问于 2021-08-19 12:09:32
回答 1查看 52关注 0票数 0

对于示例,我有一个订单,我的用户可以添加一个商店,并在每个商店中添加许多iten:

代码语言:javascript
运行
复制
Amazon
    - cup    - $ 1
    - notebook  - $ 3
                                   - $ 4   Ebay
    -  bike     - $ 10
    - boat      - $ 13
                                   - $ 23


                          Total order: $ 27  [Button to send the order]

在我的项目中,我有3个组件:

CartView -(显示订单和按钮的合计)- StoreView (显示商店名称和合计)-StoreitemView(显示要删除的项目和按钮)

让我们来质疑一下:1-显示列表的最佳方式是使用单行网格吗?有些是这样的:

代码语言:javascript
运行
复制
Grid<StoreView> myGrid = new Grid();
myGrid.addComponentColumn(this::createStoreView).setAutoWidth(true);

或者最好像这样使用a:

代码语言:javascript
运行
复制
  Div myDiv = new Div();
for(Store store in StoreList){
   muDiv.add(new StoreView(store);
}

2-如何将事件传递给父级?因此,当我的用户单击StoreItemView上的按钮时,我需要将该事件发送到我的CartView(传递给StorView,然后转到CarView以更新值并重新创建购物车)

tks

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-19 12:53:18

布局

布局取决于您期望的商店和商品的数量。如果数量很少,那么只需循环并添加组件就是一种不错的方法。

如果您有许多项,则使用具有一列的Grid是一种更好的方法,因为不会一次呈现所有项。一个更好的方法可能是IronList,或者自VirtualList以来的Vaadin 21。

如果您的视图很复杂,包含很多组件,那么使用TemplateRenderer而不是ComponentRenderer是一个好主意。如果您不喜欢用HTML语言而不是Java语言编写视图,那么您可以继续使用ComponentRenderer,尤其是在性能似乎很好的情况下。

如果每个商店有很多商品,你也可以考虑为商店内的商品建立一个虚拟列表。特别是如果只有几家商店的话。

事件

这里没有正确的答案。看起来您的StoreViewStoreItemView是紧密耦合的,所以通信也可以紧密耦合。例如,StoreItemView可以使用getRemoveButton()方法直接公开按钮。

我将使用移除事件的ComponentEvent,类似于下面的代码。您创建StoreItemView的逻辑将有所不同,您可以在StoreView中添加一个用于添加事件侦听器的方法。您可能还想向事件中添加一些数据。

代码语言:javascript
运行
复制
public class StoreView extends HorizontalLayout {

  public StoreView() {
    // Create your store items as you see fit
    StoreItemView storeItemView = new StoreItemView();
    storeItemView.getRemoveButton().addClickListener(e -> {
      remove(storeItemView);
      fireEvent(new StoreItemRemovedEvent(storeItemView));
    });
    add(storeItemView);
  }

  public static class StoreItemRemovedEvent extends
      ComponentEvent<StoreItemView> {

    public StoreItemRemovedEvent(StoreItemView source) {
      super(source, false);
    }
  }
}
代码语言:javascript
运行
复制
public class CartView extends VerticalLayout {

  public CartView() {
    StoreView storeView = new StoreView();
    ComponentUtil.addListener(storeView, StoreView.StoreItemRemovedEvent.class, e -> 
        Notification.show("Store item removed"));
    add(storeView);
  }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68847613

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档