Ger*_*zek 5 java navigation vaadin vaadin-flow
我目前有一个显示类型内容的网格SomeModel
。当我单击其中的一个条目时,Grid
我想导航到一个视图,该视图将一个对象作为其输入来显示条目内容。
为了实现这种行为,我创建了DetailLayout
这样的:
public DetailLayout extends FlexLayout implements HasUrlParameter<SomeModel>{
/* skipped some details */
@Override
public void setParameter(BeforeEvent event, Host parameter) {
/* This is where I expected to be able to handle the object */
}
}
Run Code Online (Sandbox Code Playgroud)
从内部Grid
我尝试像这样导航:
addSelectionListener((event) -> {
event.getFirstSelectedItem().ifPresent(somemodel -> {
getUI().ifPresent(ui -> {
ui.navigate(DetailLayout.class, somemodel);
});
});
});
Run Code Online (Sandbox Code Playgroud)
但不幸的是 Vaadin 不支持这种行为,尽管它的语法非常好。
您是否知道在导航时传递对象的另一种方法,或者我是否错过了官方文档的某个部分?
先感谢您
正如另一个 Answer的评论中所讨论的,如果您不希望将 ID 值作为 URL 的一部分公开,则可以使用 Vaadin 提供的键值集合在幕后工作。
\n\nVaadin 实际上提供了三个范围级别的键值集合:
\n\n应用程序范围的键值集合可在VaadinContext
、 via getAttribute
&setAttribute
方法上使用。
VaadinService.getCurrent().getContext().setAttribute( key , value ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n每个用户的键值集合可在VaadinSession
、 via getAttribute
&setAttribute
方法上使用。
VaadinSession.getCurrent().setAttribute( key , value ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n\xe2\x9e\xa5 每个浏览器窗口/选项卡集合(您在这个问题中想要满足您的需求)并不是那么容易获得。你必须经历一个间接的步骤。在类上ComponentUtil
,调用setData
&getData
方法。除了传递您的键和值之外,还传递当前UI
对象。
Component c = UI.getCurrent() ;\nString key = "com.example.acmeapp.selectedProductId" ;\nObject value = productId ;\nComponentUtil.setData( c , key , value ) ;\n
Run Code Online (Sandbox Code Playgroud)\n\n请投票给我的票#6287,这是一个在类上添加setAttribute
/getAttribute
方法的功能请求UI
,以匹配 和 的VaadinSession
功能VaadinContext
。
您可以传递它的参数,somemodel
而不是将整个对象作为 的参数navigate()
id
ui.navigate(DetailLayout.class, somemodel.getId());
Run Code Online (Sandbox Code Playgroud)
在 中,DetailLayout.setParameter()
您可以通过其 id 加载某个模型
@Override
public void setParameter(BeforeEvent beforeEvent, Long someModelId) {
if(someModelId == null){
throw new SomeModelNotFoundException("No SomeModel was provided");
}
SomeModel someModel = someModelService.findById(someModelId);
if(someModel == null){
throw new SomeModelNotFoundException("There is no SomeModel with id "+someModelId);
}
// use someModel here as you wish. probably use it for a binder?
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2323 次 |
最近记录: |