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

时间:2014-07-29 06:10:02

标签: 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();
}
}

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

  

附上!
  已初始化!

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

  

附上!
  初始化!
  分离!

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

1 个答案:

答案 0 :(得分:5)

浏览器刷新=新UI实例

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

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

@PreserveOnRefresh

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

引用此注释的文档:

  

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