我有一个简单的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();
}
}
第一次加载我的UI时,我在控制台看到输出为
附上!
已初始化!
没关系,这就是我的预期。但是当我刷新浏览器时,我的控制台输出是
附上!
初始化!
分离!
太棒了!我认为Detach !
可能首先产生,因为(我认为)在浏览器刷新时,detach()
方法应该调用attach()
,init()
应该遵循。但实际上detach()
方法会在attach()
方法之后调用。我的想法有什么不对?
答案 0 :(得分:5)
UI
实例刷新浏览器窗口或选项卡时,会创建一个新的UI
实例。因此,您会看到新 UI
实例的附加消息。稍后将分离旧的UI
实例。
这是Vaadin 7中的默认行为。您可以使用注释更改该行为。
向UI
添加@PreserveOnRefresh注释会更改行为:在刷新时不会创建新的UI
实例。
引用此注释的文档:
标记用户刷新浏览器窗口时应保留的UI。默认情况下,刷新时会创建一个新的UI实例,导致未在URL或URI片段中捕获的任何UI状态被丢弃。通过将此注释添加到UI类,框架将在检测到重新加载时重用当前UI实例。