Модули и страницы GWT: каждая хост-страница загружает оба модуля и отображает их вертикально.

Короче говоря, проблема: у меня есть два модуля, наследующих общий модуль (без точки входа), и по одной главной странице для каждого. Независимо от того, что он загружает, он загружает оба одновременно на странице. Я просто хочу, чтобы они загружались и показывались отдельно, а не вместе на всех страницах ..

Когда я запускаю Login.html, он запускает оба этих модуля (они разделяют пространство браузера по вертикали) и дважды загружает правильную точку входа (Login extends Entrypoint).

Когда я запускаю Main.html, он запускает оба этих модуля, каждый с главной точкой входа ...

Я подозреваю, что проблема заключается в структуре проекта, но мы не хотим разбивать один проект / приложение на несколько проектов только из-за модулей.

Логин:

 <?xml version="1.0" encoding="UTF-8"?>
      <module rename-to='Login'>
      <inherits name='fqdn.Common' />
      <stylesheet src='../Common.css' />  
      <!-- Specify the app entry point class. -->
      <entry-point class='fqdn.Login' />
   <module>

Основной:

 <?xml version="1.0" encoding="UTF-8"?>
      <module rename-to='Main>
      <inherits name='fqdn.Common' />
      <stylesheet src='../Common.css' />  
      <!-- Specify the app entry point class. -->
      <entry-point class='fqdn.Main' />
    <module>

Login.html:

<html>
  <head>        
    <link type="text/css" rel="stylesheet" href="css/Common.css">
    <script type="text/javascript" language="javascript" src="Login/Login.nocache.js"></script>
  </head>
  <body>
    ...
  </body>
</html>

Main.html:

<html>
  <head>        
    <link type="text/css" rel="stylesheet" href="css/Common.css">
    <script type="text/javascript" language="javascript" src="Main/Main.nocache.js"></script>
  </head>
  <body>
    ...
  </body>
</html>

Я должен признать, что обе точки входа имеют один и тот же каталог и множество классов, но не один и тот же материал Ginjector. Они называются myproject.client.Login и myproject.client.Main.

Это причина отказа GWT? Я был бы рад узнать хорошее решение или обходной путь для этой ситуации :)

Обновление: добавлены фрагменты Main.java

public class Main implements EntryPoint {

    private Logger logger = Logger.getLogger(Main.class.getName());
    private final GinMainInjector injector = GinMainInjector.INSTANCE;
    private Place defaultPlace = GWT.create(TicketPlace.class);        
    private SimplePanel appWidget;
    private EventBus eventBus;

    public void onModuleLoad() {
            logger.finest("Starting Main...");
            eventBus = injector.getEventBus();                
            MainActivityMapper activityMapper = GWT.create(MainActivityMapper.class);
            activityMapper.insertInjector(injector);
            PlaceController placeController = injector.getPlaceController();
            createAppWidgetPanel();
            startActivityManager(activityMapper, eventBus);
            startHistoryHandler(placeController, eventBus);
    }

    private void startActivityManager(ActivityMapper activityMapper, EventBus eventBus) {
            ActivityManager activityManager = new ActivityManager(activityMapper, eventBus);
            activityManager.setDisplay(appWidget);
            RootLayoutPanel.get().clear();

            RootLayoutPanel.get().add(appWidget);
    }
}

person FloHin    schedule 07.04.2014    source источник
comment
Не могли бы вы поделиться фрагментом кода fqdn.Main и fqdn.Login, где вы добавляете верхний компонент. Я хочу знать, что вы добавляете / показываете Composite/SimplePanel на странице?   -  person Braj    schedule 07.04.2014
comment
Я обновил его и добавил Main.java (Main и Login выглядят совершенно одинаково)   -  person FloHin    schedule 09.04.2014


Ответы (2)


Если вы видите оба модуля на одном экране рядом, это означает, что вы добавили их оба в свою RootPanel. Более того, это означает, что у вас есть VerticalPanel или что-то подобное в качестве контейнера вашего приложения - SimplePanel не будет принимать более одного виджета, а другие панели будут отображаться одна поверх другой или одна под другой.

Проверьте свой код в точках входа Main.java и Login.java.

person Andrei Volgin    schedule 07.04.2014
comment
Я не хочу, чтобы они показывались вместе (обновил свой вопрос, если это вводило в заблуждение). У меня нет RootPanel, только свежий экземпляр SimplePanel. - person FloHin; 07.04.2014
comment
У вас должна быть такая строка кода: RootLayoutPanel.get().add(appWidget); В противном случае ваше приложение GWT ничего не покажет на экране. Я обновил свой ответ. - person Andrei Volgin; 07.04.2014
comment
Я добавил RootLayoutPanel.get (). Clear (); RootLayoutPanel.get (). Add (appWidget); вместо просто RootPanel. - person FloHin; 09.04.2014

Теперь это работает!

Мы используем SuperDevMode, и он перепутал оба модуля. См. https://stackoverflow.com/a/20334018/2337633 для аналогичного ответа и, возможно, лучшего объяснения

Я изменил аргументы для сервера кода, чтобы загружать модули каждый, а не вместе

До:

 -src SRC package.Main package.Login

В настоящее время:

-src SRC package.Main -src SRC package.Login

Примечание. В обоих случаях SRC - это один и тот же каталог. Я не знаю, почему и как работает этот список аргументов, но каждый раз, когда я вижу оба модуля на одной странице, я запускаю DevModeOn и компилирую только текущий модуль на основе URL-адреса, а затем он снова работает.

Если я получаю перенаправление и запускается другой модуль, он снова может сломаться. Но опять же, DevModeOn для этого модуля и его перекомпиляция - работает.

Эта проблема (насколько я понимаю) была лишь незначительной проблемой использования SuperDevMode с неверными аргументами ..

Также обратите внимание, что если даже при замене всего RootLayoutPanel (тело html) на

RootLayoutPanel.get().clear();
RootLayoutPanel.get().add(appWidget);

проблема настаивала на том, чтобы остаться. Я действительно думаю, что это были просто аргументы CodeServer и мэшап перекомпиляции.

person FloHin    schedule 09.04.2014