4

问题:

我目前有一个显示类型内容的网格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 也不支持这种行为。


问题:

您是否知道在导航时传递对象的另一种方法,或者我是否错过了官方文档文档的某个部分?

先感谢您

4

3 回答 3

4

您可以传递其参数,而不是将整个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?
}
于 2019-01-30T14:50:44.163 回答
4

键值集合

正如在另一个 Answer的评论中所讨论的,如果您不希望将 ID 值作为 URL 的一部分公开,请使用 Vaadin 提供的键值集合在幕后工作。

Vaadin 实际上提供了三个范围级别的键值集合:

  • 上下文
    你的整个 web 应用在运行时
  • 会话
    每个用户
  • UI
    每个 Web 浏览器窗口/选项卡,因为 Vaadin 支持多窗口 Web 应用程序

应用范围的键值集合在VaadinContext, via getAttribute&setAttribute方法上可用。

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

每个用户的键值集合在VaadinSession, via getAttribute&setAttribute方法上可用。

VaadinSession.getCurrent().setAttribute( key , value ) ;

➥ 每个浏览器窗口/选项卡的集合(您想要在本问题中满足您的需求)并不那么容易获得。你必须经过一个间接的步骤。在ComponentUtil类上,调用setData&getData方法。除了传递你的 key 和 value 之外,还要传递当前UIobject

Component c = UI.getCurrent() ;
String key = "com.example.acmeapp.selectedProductId" ;
Object value = productId ;
ComponentUtil.setData( c , key , value ) ;

请投票给我的票 #6287setAttribute ,这是一个在类上添加/getAttribute方法的功能请求UI,以匹配VaadinSessionand的那些VaadinContext

于 2019-08-22T07:16:07.310 回答
0

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

于 2020-02-04T13:21:49.557 回答