Vaadin(流程):使用共享库导航到目的地

时间:2019-01-30 14:20:40

标签: java navigation vaadin vaadin-flow vaadin12

问题:

我目前有一个网格,显示类型为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的某些部分?

提前谢谢

3 个答案:

答案 0 :(得分:4)

键值集合

other Answer注释中所述,如果您不希望将ID值作为URL的一部分公开,则可以使用Vaadin提供的键值集合在后台进行工作。

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

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

可通过VaadinContextgetAttribute方法在setAttribute上使用应用程序范围的键值集合。

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

每个用户的键值集合可通过VaadinSessiongetAttribute方法在setAttribute上使用。

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

➥每个浏览器窗口/选项卡的集合(本课题中您希望满足的需求)并不是那么容易获得。您必须经历一个间接步骤。在ComponentUtil类上,调用setDatagetData方法。除了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就会可用。