注入后 GWT 单例小部件从 DOM 中删除

GWT singleton widget being removed from DOM after injection

我有一个共享的 GWT 小部件 "HeaderView",它是一个用于所有视图的 header。我通过 GIN 通过 -

实例化它

bind(HeaderView.class).asEagerSingleton();

然后我可以像这样注入我的观点 -

@Inject
public DashboardViewImpl(HeaderView headerView) {
    this.headerView = headerView;
    initWidget(dashboardViewUiBinder.createAndBindUi(this));
}

第一次显示视图时效果很好。但是,如果我更改位置然后返回到已经显示的视图,一旦 "HeaderView" 不再可见。检查 HTML 表明它不再附加到 DOM.

我的视图被绑定为单例 -

bind(DashboardView.class).to(DashboardViewImpl.class).in(Singleton.class);

我假设 HeaderView 在加载下一页后从 DOM 中删除,因为小部件只允许有一个 parent。

是否有在 GWT 应用程序中的所有视图之间共享小部件的正确方法?

首先,编译器非常擅长优化代码,因此制作一个小部件单例不会在代码大小方面节省太多。它确实提高了性能,但除非小部件非常复杂,否则不会引起注意。

在您的情况下,header 不应该是任何视图的一部分。您应该将它直接添加到您的应用小部件,即您添加到 RootPanel 的小部件。那么你的"views"就会占据浏览器的剩余部分window。当用户从一个视图导航到下一个视图时,您仍然可以告诉 header 它需要知道什么。