Vaadin (Flow): навигация к месту назначения с общим объектом - PullRequest
0 голосов
/ 30 января 2019

Проблема:

В настоящее время у меня есть сетка, отображающая содержимое типа 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);
        });
    });
});

Но, к сожалению, это поведение не поддерживается Ваадином, даже еслиего синтаксис в порядке.


Вопрос:

Известен ли вам другой способ пропустить объект во время навигации или я пропустил определенную часть официальной документации документация?

Заранее спасибо

1 Ответ

0 голосов
/ 30 января 2019

Вместо предоставления всего объекта somemodel в качестве параметра navigate(), вы можете передать его id

ui.navigate(DetailLayout.class, somemodel.getId());

И в DetailLayout.setParameter() вы можете загрузить 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?
}
...