我正在为一个项目使用 GWT 和 AppEngine。我想知道如何在小部件之间共享数据(ArrayList 对象),这样我就可以集中逻辑并减少对服务器的 RPC 调用次数。
我想到了两种方法,但我不知道哪个更好:
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;
}
}
这可能吗,或者如何才能做得更好?
谢谢你。