我目前有一个网格,显示类型为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 */
}
}
在Grid
中,我尝试这样导航:
addSelectionListener((event) -> {
event.getFirstSelectedItem().ifPresent(somemodel -> {
getUI().ifPresent(ui -> {
ui.navigate(DetailLayout.class, somemodel);
});
});
});
但是不幸的是,即使Vaadin的语法非常好,这种行为也不受Vaadin支持。
您是否知道导航时传递对象的另一种方法,还是我错过了官方文档documentation的某些部分?
提前谢谢
答案 0 :(得分:4)
如other Answer注释中所述,如果您不希望将ID值作为URL的一部分公开,则可以使用Vaadin提供的键值集合在后台进行工作。
Vaadin实际上提供了三个范围级别的键值集合:
可通过VaadinContext
和getAttribute
方法在setAttribute
上使用应用程序范围的键值集合。
VaadinService.getCurrent().getContext().setAttribute( key , value ) ;
每个用户的键值集合可通过VaadinSession
和getAttribute
方法在setAttribute
上使用。
VaadinSession.getCurrent().setAttribute( key , value ) ;
➥每个浏览器窗口/选项卡的集合(本课题中您希望满足的需求)并不是那么容易获得。您必须经历一个间接步骤。在ComponentUtil
类上,调用setData
和getData
方法。除了passing your key and your value, pass the current UI
object。
Component c = UI.getCurrent() ;
String key = "com.example.acmeapp.selectedProductId" ;
Object value = productId ;
ComponentUtil.setData( c , key , value ) ;
请投票支持我的ticket # 6287,这是一项功能请求,它需要在setAttribute
类上添加getAttribute
/ UI
方法,以与VaadinSession
和{ {1}}。
答案 1 :(得分:2)
您可以传递其somemodel
navigate()
对象作为id
的参数。
ui.navigate(DetailLayout.class, somemodel.getId());
在DetailLayout.setParameter()
中,您可以按其ID加载somemodel
@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?
}
答案 2 :(得分:0)
如果您将Spring与Vaadin Flow一起使用,则可以创建一个@UIScope
d bean,并添加自己的字段来存储与当前浏览器窗口/选项卡相关的状态。只要存在UI
,该bean就会可用。