我最近尝试关注Large scale application development and MVP tutorial。这个教程很棒,但我很难做一些事情。
如果您尝试将联系人添加到列表,则会创建联系人。如果您尝试添加其他联系人,则会转到您创建的最后一个联系人的编辑屏幕。添加第一个联系人后,无法再添加联系人。需要更改的内容,以便您可以添加多个联系人。
我试图让它发挥作用的改变:
每次按下添加按钮时,创建一个新的editContactsView。这会打开一个空白的编辑屏幕,但新的联系人仍会覆盖之前的添加。
在确定新联系人的ID时,将contacts.size()更改为contacts.size()+ 1。
答案 0 :(得分:6)
实际上,有一些问题(我可以看到):
Contact
创建的新EditContactPresenter
未获得指定的ID(null
)。这是因为EditContactPresenter
使用了未设置id的默认Contact()
构造函数。有许多可能的解决方案:在默认构造函数中添加设置id(这样您就不必跟踪应用程序中其他位置的ID),将该功能委托给您的服务器(例如,创建您的数据库)生成下一个可用ID并将其发回(或)只需在contact.setId(whatever);
EditContactsPresenter
Contact
,它不会清除它。解决方案:要么禁用视图重用(每次只创建一个新的EditContactsView
),要么添加clear()
或类似于您的视图,并让Presenters在想要创建新条目时调用它,而不是编辑现有的一个(在这种情况下,当前条目中的值会覆盖旧值,所以没关系。)奇怪的是,这个样本留下了这样的错误 - 虽然我知道它的主要目的是展示MVP和GWT如何结合在一起,但仍然:/
答案 1 :(得分:0)
添加新联系人时,永远不会设置ID。因为id字段是一个字符串,所以它存储为“”。这就是添加第一个联系人的方式。现在,每次创建新联系人时,都会用“”键覆盖联系人。要解决此问题,您需要设置id的值。我是通过更改EditContactsPresenter中的doSave方法完成的。
private void doSave() {
contact.setFirstName(display.getFirstName().getValue());
contact.setLastName(display.getLastName().getValue());
contact.setEmailAddress(display.getEmailAddress().getValue());
if(History.getToken.equals("add")
rpcService.updateContact(contact, new AsyncCallback<Contact>() {
public void onSuccess(Contact result) {
eventBus.fireEvent(new ContactUpdatedEvent(result));
}
public void onFailure(Throwable caught) {
Window.alert("Error updating contact");
}
});
else
rpcService.updateContact(contact, new AsyncCallback<Contact>() {
public void onSuccess(Contact result) {
eventBus.fireEvent(new ContactUpdatedEvent(result));
}
public void onFailure(Throwable caught) {
Window.alert("Error updating contact");
}
});
}