Vaadin 14 Grid + Dialog: Как обновить сетку sh после закрытия диалога? - PullRequest
1 голос
/ 05 января 2020

Я использую Vaadin 14. У меня есть Grid для отображения пользователей. Также у меня есть кнопка для создания и сохранения новых пользователей. Моя MainGrid выглядит вот так:

public class MainView extends VerticalLayout {

    private final UserService userService;
    private final AddUserDialog addUserDialog;
    private Grid<UserDto> grid;

    public MainView(UserService userService,
                    AddUserDialog addUserDialog) {
        this.userService = userService;
        this.addUserDialog = addUserDialog;
    }

    @PostConstruct
    private void renderComponents() {
        renderAddUserButton();
        renderUserGrid();
    }

    private void renderAddUserButton() {
        Button addUserButton = new Button("Добавить", VaadinIcon.PLUS.create());
        addUserButton.addClickListener(event -> addUserDialog.open());
        add(addUserButton);
    }
    private void renderUserGrid() {
        grid = new Grid<>(UserDto.class);
        //grid init here
        add(grid);
    }
}

А диалог выглядит вот так:

public class AddUserDialog extends Dialog {
    private final UserService userService;

    public AddUserDialog(UserService userService) {
        this.userService = userService;
    }
    @PostConstruct
    public void init() {
        //init form here
    }
    private void save(Binder<UserDto> binder) {
        UserDto userDto = new UserDto();
        try {
            binder.writeBean(userDto);
        } catch (ValidationException e) {
            e.printStackTrace();
        }
        userService.save(userDto);
        this.close();
    }
}

Пожалуйста, совет, как обновить sh сетку после закрытия диалога?

1 Ответ

2 голосов
/ 06 января 2020

В такой ситуации лучше всего хранить все логи c на главном экране. Если и ваш главный вид, и диалоговое окно обновляют данные независимо друг от друга, очень легко оказаться в ситуации, когда ваши данные противоречивы.

Мое предложение заключается в том, чтобы вы изменили диалоговое окно для запуска сохраненного события при сохранении пользователя и чтобы вы прослушали это событие в главном окне и соответствующим образом обновили его. Таким образом, вы сохраняете состояние просмотра только в одном месте.

public class AddUserDialog extends Dialog {

    private void save(Binder<UserDto> binder) {
        UserDto userDto = new UserDto();
        try {
            binder.writeBean(userDto);
            fireEvent(new SaveEvent(this, userDto));
        } catch (ValidationException e) {
            e.printStackTrace();
        }
    }

    public static abstract class UserDialogEvent extends ComponentEvent<AddUserDialog> {
        private UserDto userDto;

        protected UserDialogEvent(AddUserDialog source, UserDto userDto) {
            super(source, false);
            this.userDto = userDto;
        }

        public UserDto getUserDto() {
            return userDto;
        }
    }

    public static class SaveEvent extends UserDialogEvent {
        public SaveEvent(AddUserDialog source, UserDto userDto) {
            super(source, userDto);
        }
    }

    public <T extends ComponentEvent<?>> Registration addListener(Class<T> eventType,
                                                                  ComponentEventListener<T> listener) {
        return getEventBus().addListener(eventType, listener);
    }
}

(Вы можете избавиться от абстрактного класса событий, если не видите необходимости в дополнительных событиях, таких как отмена и т. Д. c)

Затем в MainView прослушайте событие и обновите состояние соответственно.

public class MainView extends VerticalLayout {

    private final UserService userService;
    private final AddUserDialog addUserDialog;
    private Grid<UserDto> grid;

    public MainView(UserService userService) {
        this.userService = userService;
        addUserDialog = new AddUserDialog();
        addUserDialog.addListener(AddUserDialog.SaveEvent.class, this::saveUser);
    }

    @PostConstruct
    private void renderComponents() {
        renderAddUserButton();
        renderUserGrid();
    }

    private void renderAddUserButton() {
        Button addUserButton = new Button("Добавить", VaadinIcon.PLUS.create());
        addUserButton.addClickListener(event -> addUserDialog.open());
        add(addUserButton);
    }
    private void renderUserGrid() {
        grid = new Grid<>(UserDto.class);
        //grid init here
        add(grid);
    }

    private void saveUser(AddUserDialog.SaveEvent saveEvent) {
        userService.save(saveEvent.getUserDto());
        addUserDialog.close();
        refreshGrid();

        addUserDialog.addDialogCloseActionListener()
    }

    private void refreshGrid() {
        // refresh grid
    }
}
...