Vaadin(流):使用共享对象导航到目的地
Vaadin (Flow): Navigating to destination with a shared object
问题:
我目前有一个显示 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 不支持这种行为,即使它的语法非常好。
问题:
您知道导航时传递对象的另一种方法吗?或者我是否错过了官方文档的某个部分documentation?
提前致谢
不是将整个 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?
}
键值集合
如 的评论中所述,如果您不希望将 ID 值公开为 URL 的一部分,则使用键值集合在幕后工作由 Vaadin 提供。
Vaadin 实际上在三个范围级别提供键值集合:
- 上下文
运行时的整个网络应用程序
- 会话
每个用户
- UI
每个网络浏览器window/tab,因为 Vaadin 支持多window 网络应用程序
可通过 getAttribute
和 setAttribute
方法在 VaadinContext
上使用应用范围的键值集合。
VaadinService.getCurrent().getContext().setAttribute( key , value ) ;
每个用户的键值集合可在 VaadinSession
上通过 getAttribute
和 setAttribute
方法获得。
VaadinSession.getCurrent().setAttribute( key , value ) ;
➥ 每个浏览器-window/tab 集合(您在这个问题中想要满足您的需求)并不是那么容易获得。你必须经历一个间接的步骤。在 ComponentUtil
class, call setData
& getData
methods. In addition to 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 投票,这是一个在 UI
class 上添加 setAttribute
/getAttribute
方法的功能请求,以匹配 VaadinSession
和 VaadinContext
。
如果您将 Spring 与 Vaadin Flow 一起使用,那么您可以创建一个 @UIScope
d bean 并添加您自己的字段来存储与当前浏览器相关的状态 window/tab。只要 UI
存在,bean 就可用。
问题:
我目前有一个显示 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 不支持这种行为,即使它的语法非常好。
问题:
您知道导航时传递对象的另一种方法吗?或者我是否错过了官方文档的某个部分documentation?
提前致谢
不是将整个 somemodel
对象作为 navigate()
的参数,您可以传递它的 id
ui.navigate(DetailLayout.class, somemodel.getId());
并且在 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?
}
键值集合
如
Vaadin 实际上在三个范围级别提供键值集合:
- 上下文
运行时的整个网络应用程序 - 会话
每个用户 - UI
每个网络浏览器window/tab,因为 Vaadin 支持多window 网络应用程序
可通过 getAttribute
和 setAttribute
方法在 VaadinContext
上使用应用范围的键值集合。
VaadinService.getCurrent().getContext().setAttribute( key , value ) ;
每个用户的键值集合可在 VaadinSession
上通过 getAttribute
和 setAttribute
方法获得。
VaadinSession.getCurrent().setAttribute( key , value ) ;
➥ 每个浏览器-window/tab 集合(您在这个问题中想要满足您的需求)并不是那么容易获得。你必须经历一个间接的步骤。在 ComponentUtil
class, call setData
& getData
methods. In addition to 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 投票,这是一个在 UI
class 上添加 setAttribute
/getAttribute
方法的功能请求,以匹配 VaadinSession
和 VaadinContext
。
如果您将 Spring 与 Vaadin Flow 一起使用,那么您可以创建一个 @UIScope
d bean 并添加您自己的字段来存储与当前浏览器相关的状态 window/tab。只要 UI
存在,bean 就可用。