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 网络应用程序

可通过 getAttributesetAttribute 方法在 VaadinContext 上使用应用范围的键值集合。

VaadinService.getCurrent().getContext().setAttribute( key , value ) ;

每个用户的键值集合可在 VaadinSession 上通过 getAttributesetAttribute 方法获得。

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 方法的功能请求,以匹配 VaadinSessionVaadinContext

如果您将 Spring 与 Vaadin Flow 一起使用,那么您可以创建一个 @UIScoped bean 并添加您自己的字段来存储与当前浏览器相关的状态 window/tab。只要 UI 存在,bean 就可用。