1

假设我的观点是:

@Route(value="test")
public class TestView extends VerticalLayout implements BeforeEnterObserver {
    public TestView() {
        super();
        // do some stuff.
        new Button("Test", click -> getUI().ifPresent(ui -> ui.navigate("test")));
    }
    
    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        // do some other stuff.
    }
}

如果我单击上面的 Test 按钮,则不会实例化构造函数,但是beforeEnter()会调用该方法。在我的情况下,我更喜欢实例化整个视图类,因为该beforeEnter()方法包含视图需要的一些逻辑和设置代码,如果调用两次可能会弄乱组件。特别是beforeEnter()做一些检查,根据细节可能会调用不同的组件渲染路径。

4

2 回答 2

1

请尝试以下代码。它从 UI 中删除视图(导航目标)实例,然后在客户端调用页面重新加载。然后,在页面重新加载后,对服务器的下一个请求将强制创建一个新的视图实例。

@Route(value="test")
public class TestView extends VerticalLayout implements BeforeEnterObserver {

    private final String uuid;

    public TestView() {
        super();
        // do some stuff.
        System.out.println("CTOR called");
        uuid = UUID.randomUUID().toString();

        final Element view = getElement();
        Button button = new Button("Test", click -> {
                    getUI().ifPresent(ui -> ui.getPage().setLocation("test"));
                    view.removeFromParent();
                });
        add(button);
    }

    @Override
    public void beforeEnter(BeforeEnterEvent event) {
        // do some other stuff.
        System.out.println("Before enter");
        System.out.println("UUID = " + uuid);
    }
}

输出:

CTOR called
Before enter
UUID = 74306acc-3771-4998-aa46-19834ca9e033
CTOR called
Before enter
UUID = dbc1be2a-1bee-4da7-b676-187208621569

希望这是您想要达到的目标。

于 2022-01-14T18:55:24.827 回答
0

如果您将 Spring 与 Vaadin 一起使用,则可以使用

@Component
@Scope("prototype")
于 2022-01-13T19:14:00.023 回答