在attach()方法之后调用detach()方法吗?

Cat*_*ysm 1 vaadin vaadin7

我有一个简单的UI类

public class HelloWorldUI extends UI {

@Override
protected void init(VaadinRequest request) {
    System.out.println("Initialized !");
    final VerticalLayout layout = new VerticalLayout();
    layout.addComponent(new Label("Hello World !"));
    setContent(layout);
}

@Override
public void detach() {
    System.out.println("Detach !");
    super.detach();
}

@Override
public void attach() {
    System.out.println("Attach !");
    super.attach();
}
}
Run Code Online (Sandbox Code Playgroud)

第一次加载UI时,我在控制台看到输出为

附上!
初始化了!

没关系,这就是我的预期.但是当我刷新浏览器时,我的控制台输出是

附上!
初始化了!
分离!

惊人 !我认为Detach !可能首先产生,因为(我认为)浏览器刷新时,detach()方法应该调用attach(),init()应该遵循.但实际上detach()方法会在attach()方法之后调用.我的想法有什么不对?

Hen*_*ola 5

浏览器刷新=新UI实例

刷新浏览器窗口或选项卡时,UI会创建一个新实例.因此,您会看到 UI实例的附加消息.旧UI实例稍后将分离.

这是Vaadin 7中的默认行为.您可以使用注释更改该行为.

@PreserveOnRefresh

@PreserveOnRefresh注释添加到UI更改行为:UI刷新时不会创建新实例.

引用此注释的文档:

标记用户刷新浏览器窗口时应保留的UI.默认情况下,刷新时会创建一个新的UI实例,导致未在URL或URI片段中捕获的任何UI状态被丢弃.通过将此批注添加到UI类,框架将在检测到重新加载时重用当前UI实例.

  • 它是一个注释,因此如果您添加它,它将用于每个UI实例.如果您确实希望refesh不创建新的UI实例,那么请始终使用注释.有些项目喜欢这种方式,有些则更喜欢新的用户界面. (2认同)