我在同一模块中有多个入口点。

例如,我有一个主页的主页入口点和管理页面的管理点。

<entry-point class='com.company.project.client.HomeModule'/> 
<entry-point class='com.company.project.client.AdminModule'/> 

我现在的设置方式 - 我需要在我的onmoduleload中检查这样的情况:

if((RootPanel.get("someHomeWidget")!=null)&& 
  (RootPanel.get("someOtherHomeWidget")!=null)) 
{ 
  // do the stuff 
} 

为了顺序,当主页打开并以相反的方式打开时,不需要执行管理点。

上面不进行检查还涉及到,如果我在家庭和管理页面中都有相同名称的div,则无论我注入什么都在其中显示了两次。

这在 1000 英里之外就很臭,而且显然是错误的:在人们体验中做到这一点的正确方法是什么?

任何帮助表示赞赏!

有帮助吗?

解决方案

正确的方法是让每个模块一个单一的入口点,即支相应小部件在相应的div:

RootPanel panel = RootPanel.get("someHomeWidget");
if (panel) panel.add(new HomeWidget());

panel = RootPanel.get("adminWidget");
if (panel) panel.add(new AdminWidget());

这样,它只是扫描找你有任何的div的页面,并插入相应的部件。所以,你的HTML页面确定何时和GWT代码是准备处理任何情况下,小部件显示的内容。有没有什么关于发臭以上,这是你的切入点应写入的方式。

另一种方法是,如果你的管理区和一般区是完全不同的(例如:你想在不同的时间来加载它们)。然后他们应该是独立的模块,有独立的入口点

其他提示

我还想在 GWT 玩具应用程序中使用多个页面,我想我已经找到了。对部署描述符 (myApp.gwt.xml) 进行了一些处理,但这就是我所做的。

  • 创建另一个类实现 EntryPoint 并添加一些仅添加到新页面中的 div 的代码。
  • 复制了原来的 gwt.xml 并更改了两件事:
    • 模块重命名为 - 我更改为“anothergwtapp”
    • 入口点指定了新类。
  • 当我编译项目时,“war”文件夹中还有另一个目录,名为(等等......)“anothergwtapp”。它包含“anothergwtapp.nocache.js”,这是 GWT 的魔力。
  • 最后,我复制了原始 HTML 页面,并将“stockwatcher/stockwatcher.nocache.js”替换为“anothergwtapp/anothergwtapp.nocache.js”(是的,我很新 - 教程仍然在我的机器上)
    • 我将新的 HTML 更改为略有不同(用于填充新入口点 onload 的新 div),并在第一页中向新页面添加了一个简单的 href。

有效。只需复制 gwt.xml 并为模块提供一个新名称即可与新的应用程序页面一起使用。我查看了其他一些链接,我可能实际上已经完成了所描述的操作,但是有太多的单词和重定向等(即我真的什么都没读过)。我正在使用 Galileo 的最新 GWT 插件,所以现在可能是 IJW。

不要考虑管理和主页为不同的页面。页面概念并不适用于GWT,因为只有一个页面,即单一入口点。  如果你想给不同的页面的效果,然后使用URL重写GWT的功能。

如果你想使用不同的入口点,那么作为表示上述评论,使用不同的模块。

它通常是最好只有一个入口点。在一个模块中的多个入口点都开始在同一时间,有时可以做的事情,你没有想到的。

您有足够的如何分别处理它的选项: - 有2倍不同的编译一个管理员和一个用于主页应用。 - 使用历史标记,以表明您希望管理员或家庭 - 检查JS变量显示一个或其他 - 检查特定的DIV ID的存在表明管理员或家庭(RootPanel.get(ID)) - 使用URL参数来表示应用程序。 - ...等

有一个简单的(棘手)的方式来实现这一点:

请一个主类的切入点。

<module rename-to='gwt'>
  <inherits name='com.google.gwt.user.User'/>
  <entry-point class='com.example.client.Main'/>
  <source path='client'/>
  <source path='shared'/>
</module>;<br/>

创建此Main.java像一个调度程序的工作:

package com.example.client;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.ui.RootPanel;

public class Main implements EntryPoint {

  public void onModuleLoad() {

    String url = Window.Location.getHref();
    if ( url.indexOf("?install")>-1 ) {
      Install install = Install.getInstance();
      RootPanel.get().add(install);      
    else if ( url.indexOf("?admin")>-1 ) {
      Admin admin = Admin.getInstance();
      RootPanel.get().add(admin);    
    } else {
      Application app = Application.getInstance();
      RootPanel.get().add(app);      
    }
  }
}

现在不同类别的应用程序,管理和安装 工作就像独立的单位。

下面是例如简单的安装:

package comexample.client;

import com.google.gwt.user.client.ui.FlowPanel;
import com.google.gwt.user.client.ui.HTML;

public class Install extends FlowPanel {

  /** Singleton stuff - to access Main from all subclasses! */
  private static Install singelton;
  public static Install getInstance() {
    if (singelton == null) {singelton = new Install();}
    return singelton;
  }

  /** Constructor - called by Main.onModuleLoad() */
  private Install() {
    this.add(new HTML("<h1>Do whatever You have to do!</h1>"));
  }
}

您不需要辛格尔顿的东西(的getInstance),但它是在大的应用非常方便。

现在在/战争目录中创建一个名为安装目录和管理,并非常人创建一个HTML页面是这样的:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="refresh" content="0; URL=/index.html?install">
</head>
<body></body>
</html>

因此,当用户指引他布劳尔到 http://www.example.com/install 他将被重定向到 http://www.example.com/index?install 和index.html势必Main.java将请求分派并加载Install.java

我在我的博客了一个解决方案。您可以下载有多个入口点,并使用URL重写的样本Maven项目。请看: http://zenoconsulting.wikidot.com/blog:16

你有没有尝试这个框架吗? http://gwtmultipage.org/ 克劳

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top