gpt4 book ai didi

java - 为什么使用 Navigator 和 SpringViewProvider 时页面会加载两次?

转载 作者:行者123 更新时间:2023-12-02 02:38:19 25 4
gpt4 key购买 nike

我想在同一个窗口选项卡中显示不同的页面。我使用 Empty 和 Empty1 类。类 Empty 是一个主页面, View Empty1 被加载到 Empty 中。

名为 Empty 的类:

@Theme("valo")
@SpringUI(path = "empty")

public class Empty extends UI {

@Autowired
private SpringViewProvider viewProvider;

@Override
protected void init(VaadinRequest request) {
System.out.println("init Empty");
final VerticalLayout root = new VerticalLayout();
root.setSizeFull();
setContent(root);

Navigator navigator = new Navigator(this, this);
navigator.addProvider(viewProvider);
navigator.navigateTo(Empty1.VIEW_NAME);
}
}

和名为 Empty1 的类( View ):

@SpringView(name = Empty1.VIEW_NAME)
public class Empty1 extends VerticalLayout implements View {
public static final String VIEW_NAME = "empty1";

@PostConstruct
void init() {
addComponent(new Label("This is the default view"));
System.out.println("init Empty1");
}

@Override
public void enter(ViewChangeListener.ViewChangeEvent event) {
// the view is constructed in the init() method()
}
}

当我打开新窗口时,我看到一句“这是默认 View ”,没关系。 但是当我查看 trackstace 时,我注意到句子“init Empty1”显示了两次,为什么?

这意味着 View Empty1 的内容被加载了两次。 我希望该 View 仅加载一次。

最终效果在“Empty”类中应该看起来像这样:

@Theme("valo")
@SpringUI(path = "empty")

public class Empty extends UI {

@Autowired
private SpringViewProvider viewProvider;

@Override
protected void init(VaadinRequest request) {
System.out.println("init Empty");
final VerticalLayout root = new VerticalLayout();
root.setSizeFull();
setContent(root);

Navigator navigator = new Navigator(this, this);
navigator.addProvider(viewProvider);

int optionAuto = 2;

switch (optionAuto) {
case 1:
getUI().getNavigator().navigateTo(Empty1.VIEW_NAME);
break;
case 2:
getUI().getNavigator().navigateTo(Empty2.VIEW_NAME);
break;
}
}
}

它有效,但 View “Empty1”或“Empty2”被调用两次。如何修改代码以使 View 仅被调用一次?

最佳答案

发生这种情况的原因是您在 Empty.init() 方法中调用了 Navigator.navigateTo() 。每个导航操作都会创建新的 View bean 实例( View 不是单例)。调用 Navigator.navigateTo() 后,稍后会在 UI.doInit() 方法中再次调用它,从而创建第二个 bean。

如果您想让“empty1” View 成为默认 View (如果 url 中未指定其他 View 则显示该 View ),那么类似这样的操作应该有效:

if ("".equals(navigator.getState())) {
getPage().setUriFragment("!" + Empty1.VIEW_NAME, false);
}

当然,您也可以将 View 命名为 "" 以使其成为默认 View 。

关于java - 为什么使用 Navigator 和 SpringViewProvider 时页面会加载两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45903101/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com