2012-05-29 2 views
0

Я использую GWT и AppEngine для проекта. Я хотел бы знать, как я могу обмениваться данными (объектами ArrayList) между виджетами, чтобы я мог централизовать логику и сократить количество вызовов RPC на сервер.Как разделить ресурсы данных между виджетами в GWT

Я подумал о двух способов, но я не знаю, что лучше:

1) Когда я создаю экземпляр виджета, я передать объект ArrayList в качестве параметра, хотя я не знаю, как это сделать, потому что виджет получает экземпляр с:

ThisAppShell shell = GWT.create(ThisAppShell.class);  

2) используя механизм, как eventBus

http://www.dev-articles.com/article/Gwt-EventBus-(HandlerManager)-the-easy-way-396001

Когда пользователь загружает приложение после завершения процесса входа в систему, я хотел бы загрузить список сотрудников, который должен быть доступен для всех виджетов. Это должно быть сделано в методе onModuleLoad(). Я хотел бы загрузить их все при запуске, потому что я хотел бы реализовать какой-то механизм кэширования. Например, я хочу иметь 2 экземпляра ArrayList: - emplListOnStart, который заполняется при загрузке приложения - emplListChanges - массив, на котором пользователь внесет изменения изнутри виджетов.

После того, как пользователь завершил внесение изменений (он нажмет кнопку «Сохранить»), будут сопоставлены два массива, различия будут сохранены в appengine (через RPC), а также обновлены в emplListOnStart.

Это код класса EntryPoint:

public class ThisApp implements EntryPoint { 
ThisAppShell shell = GWT.create(ThisAppShell.class); 
LoginServiceAsync loginService = GWT.create(LoginService.class); 

private ArrayList<Employee> emplListOnStart; 

private ArrayList<Employee> emplListChanges; 

public void onModuleLoad() { 
    RootLayoutPanel.get().clear(); 
    RootLayoutPanel.get().add(shell); 
    loginService.isAuthenticated(new AsyncCallback<UserDto>() { 

     public void onFailure(Throwable caught) { 
      // TODO Auto-generated method stub 

     } 

     public void onSuccess(UserDto result) { 
          //Here I should load the emplListOnStart list; 
     } 

    }); 
    shell.getLogoutLink().addClickHandler(new ClickHandler() { 
     public void onClick(ClickEvent event) { 
      loginService.logout(new AsyncCallback() { 
       public void onFailure(Throwable caught) { 

       } 

       public void onSuccess(Object result) { 
              //Here the user will get logged out 
       } 
      }); 
      Window.Location.assign(""); 
     } 
    }); 

    } 
} 

А вот код виджета:

public class ThisAppShell extends Composite { 

private static ThisAppShellUiBinder uiBinder = GWT 
     .create(ThisAppShellUiBinder.class); 

interface ThisAppShellUiBinder extends UiBinder<Widget, ThisAppShell> { 
} 

@UiField 
Anchor logout_link; 
@UiField 
StackLayoutPanel stackLPanel; 
@UiField 
TabLayoutPanel tabLPanel; 

public ThisAppShell() { 
    initWidget(uiBinder.createAndBindUi(this)); 

    initializeWidget(); 
} 

public void initializeWidget() { 
    stackLPanel.add(new HTML("Manage empl."), new HTML("Employees"), 30); 
    stackLPanel.add(new HTML("Manage Dept."), new HTML("Departments"), 30); 

    // Add a home tab 
    HTML homeText = new HTML("This is the home tab"); 
    tabLPanel.add(homeText, "Home"); 

    // Add a tab 
    HTML moreInfo = new HTML("This is the more info tab"); 
    tabLPanel.add(moreInfo, "More info"); 

    // Return the content 
    tabLPanel.selectTab(0); 
} 

public Anchor getLogoutLink() { 
    return logout_link; 
} 

} 

Возможно ли это, и как это можно сделать лучше?

спасибо.

ответ

1

Я думаю, что есть два способа сделать это:

  1. Создать сеттер на ваш виджет, чтобы установить экземпляры ArrayList (setData()). Затем вы можете вызвать эту функцию в методе onSuccess вашего входа в систему.

  2. Внесите экземпляр singleton глобального EventBus в ваш виджет (используя i.e. gin/guice) и запустите событие, содержащее ваши данные. В виджетах вы должны присоединить EventHandler для конкретного события (то есть LoadEmplListEvent).

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

Решение является более чистым подходом, поскольку он отключает ваши виджеты от остальных. Вы запускаете событие данные в свой метод onSuccess один раз, и вам не нужны виджеты.
Виджеты, заинтересованные в данных, будут следить за тем, чтобы они обрабатывали событие соответствующим образом (путем обработки события). Я думаю, если у вас есть много виджетов, которым приходится иметь дело с данными, то второй подход подходит для этого.

+0

Спасибо. Второй вариант звучит лучше. Можете ли вы порекомендовать мне хорошее чтение, чтобы реализовать что-то подобное? (например, уроки, примеры) – Berry

+0

, вы можете проверить этот stackoverflow [post] (http://stackoverflow.com/questions/6030202/how-to-use-the-gwt-eventbus). Это [статья] (http://arcbees.wordpress.com/2010/08/24/gwt-platform-event-best-practice/) относится к GWTP (MVP framework), но также относится и к проектам без GWTP. Это видеоконференции google io также [стоит] (http://www.google.com/events/io/2009/sessions/GoogleWebToolkitBestPractices.html). –