Я использую 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;
}
}
Возможно ли это, и как это можно сделать лучше?
спасибо.
Спасибо. Второй вариант звучит лучше. Можете ли вы порекомендовать мне хорошее чтение, чтобы реализовать что-то подобное? (например, уроки, примеры) – Berry
, вы можете проверить этот 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). –