【发布时间】:2019-09-05 01:13:54
【问题描述】:
我正在尝试构建一个 Vaadin/Spring 应用程序。我正在使用 Spring Security,并基于此 tutorial 中的示例和信息来构建应用程序的安全部分。我的主/主页视图是一个非常简单的带有 Vaadin Grid 的视图:
@SpringComponent
@UIScope
@Route(value = "", layout = MainLayout.class)
public class MainView extends HorizontalLayout {
private ItemService itemService;
private Grid<ItemDTO> itemGrid;
@Autowired
public MainView(ItemService itemService) {
this.itemService = itemService;
var items = this.itemService.getItems();
this.itemGrid = new Grid<>(ItemDTO.class);
this.itemGrid.addColumn(ItemDTO::getName).setHeader("Name");
this.itemGrid.addColumn(ItemDTO::getUnitId).setHeader("Unit");
this.itemGrid.setItems(items);
add(itemGrid);
}
}
上面引用的MainLayout类也很简单:
@SpringComponent
@UIScope
public class MainLayout extends VerticalLayout implements RouterLayout, HasComponents {
private Div childWrapper = new Div();
public MainLayout() {
H1 heading = new H1("Price List");
MenuBar menu = new MenuBar();
MenuItem vendor = menu.addItem("Vendor");
vendor.getSubMenu().addItem(new RouterLink("Wal-Mart", VendorView.class, "WMRT"));
HorizontalLayout header = new HorizontalLayout(heading, menu);
header.setSizeFull();
add(header);
add(childWrapper);
}
@Override
public void showRouterLayoutContent(HasElement content) {
childWrapper.getElement().appendChild(content.getElement());
}
}
但是,在登录并被重定向到 MainView 后,Grid 根本无法加载:
但是,如果我从 MainView 中删除 layout = MainLayout.class,它会加载罚款。项目中的另一个视图,类似地使用 Vaadin Grid 并引用 MainView,加载得很好:
@SpringComponent
@UIScope
@Route(value = "vendor", layout = MainLayout.class)
public class VendorView extends VerticalLayout implements HasUrlParameter<String> {
private String prop;
private Grid<VendorItemDTO> itemGrid;
private VendorItemService vendorService;
public VendorView(VendorItemService vendorService) {
this.vendorService = vendorService;
}
@Override
public void setParameter(BeforeEvent event, String parameter) {
this.prop = parameter;
this.setUpUI();
}
private void setUpUI() {
var items = this.vendorService.findByVendor(prop);
var h2 = new H2("Items for " + this.prop);
this.itemGrid = new Grid<>();
this.itemGrid.addColumn(VendorItemDTO::getItemName).setHeader("Item");
this.itemGrid.addColumn(VendorItemDTO::getTotalPrice).setHeader("Total Price");
this.itemGrid.addColumn(VendorItemDTO::getUnitString).setHeader("Units");
this.itemGrid.setItems(items);
add(h2, itemGrid);
}
}
这是我第一次使用 Vaadin,如果这是一个明显的错误,我深表歉意,但我参考了该项目的文档和视频,但尚未解决问题。
谢谢。
【问题讨论】:
-
在浏览器开发者工具中,检查
<vaadin-grid>元素是否存在于MainView中。由于某种原因,它可能只是宽度/高度为 0 的情况。 -
从 vaadin 14 开始,每次向项目中引入新组件时,您都必须使用“prepare-frontend”进行重建。否则它不会显示组件。
-
感谢您的回复。事实证明,@Tazavoo 是正确的 - Grid(或者它的容器)没有明显的宽度。只需调用
setWidthFull()即可轻松解决此问题。事后看来,我想这应该是显而易见的,但我仍然不完全理解为什么该网格的宽度为 0,而在其他两种情况下没有发生这种情况(当layout=被删除时以及其他视图时)。我想我有很多关于框架的知识。感谢打扰受访者。 -
这不是很明显,我自己也遇到过很多次,这是 Vaadin 可以改进的地方。根本原因是一个视图是
VerticalLayout,另一个视图是HorizontalLayout。在垂直布局中,孩子们根据需要采用全宽和全高。在水平模式中,它们根据需要采用全高和全宽。显然Grid认为它需要 0 宽度,因此默认情况下它在水平布局中不可见。
标签: java spring-boot vaadin