Gwt 大规模应用程序开发和MVP教程中的问题

Gwt 大规模应用程序开发和MVP教程中的问题,gwt,Gwt,我最近试着跟随这个故事。这个教程很棒,但我在一些事情上遇到了困难 如果尝试将联系人添加到列表中,则会创建该联系人。如果您尝试添加另一个联系人,您将进入上次创建的联系人的编辑屏幕。添加第一个联系人后,无法再添加更多联系人。需要更改的内容,以便您可以添加多个联系人 我为使其正常工作所做的更改: 每次按下“添加”按钮时,创建一个新的editContactsView。这将显示一个空白编辑屏幕,但新联系人仍会覆盖以前添加的内容 确定新联系人的ID时,将contacts.size()更改为contacts.

我最近试着跟随这个故事。这个教程很棒,但我在一些事情上遇到了困难

如果尝试将联系人添加到列表中,则会创建该联系人。如果您尝试添加另一个联系人,您将进入上次创建的联系人的编辑屏幕。添加第一个联系人后,无法再添加更多联系人。需要更改的内容,以便您可以添加多个联系人

我为使其正常工作所做的更改:

每次按下“添加”按钮时,创建一个新的editContactsView。这将显示一个空白编辑屏幕,但新联系人仍会覆盖以前添加的内容


确定新联系人的ID时,将contacts.size()更改为contacts.size()+1

添加新联系人时,其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");        
        }    
    });  
}
private void doSave(){
contact.setFirstName(display.getFirstName().getValue());
contact.setLastName(display.getLastName().getValue());
contact.setEmailAddress(display.getEmailAddress().getValue());
if(History.getToken.equals(“add”)
updateContact(联系人,新建AsyncCallback(){
成功时公共无效(联系结果){
fireEvent(新的ContactUpdateEvent(结果));
}        
失败时的公共无效(可丢弃){
Window.alert(“更新联系人时出错”);
}    
});  
其他的
updateContact(联系人,新建AsyncCallback(){
成功时公共无效(联系结果){
fireEvent(新的ContactUpdateEvent(结果));
}        
失败时的公共无效(可丢弃){
Window.alert(“更新联系人时出错”);
}    
});  
}

事实上,有几个问题(从我所看到的):

  • 与前面提到的Lumpy一样,通过
    EditContactPresenter
    创建的新
    Contact
    没有分配id(它是
    null
    )。这是因为
    EditContactPresenter
    使用默认的
    Contact()
    不设置id的构造函数。有很多可能的解决方案:在默认构造函数中添加id设置(这样你就不必在应用程序的其他地方跟踪id),将该功能委托给服务器(例如,让数据库生成下一个可用id并将其发送回服务器)或者只需在
    EditContactsPresenter
  • AppController.java:134-此示例重用视图(这是一个好主意),但如果您将其用于创建新的
    联系人
    ,则不会清除该视图。解决方案:禁用视图重用(每次只需创建一个新的
    EditContactsView
    )或添加一个
    clear()
    或类似于您的视图的内容,并让演示者在创建新条目时调用它,而不是编辑现有条目(在这种情况下,当前条目中的值将覆盖旧值,因此可以)

奇怪的是,这个示例留下了这样的bug——虽然我知道它的主要目的是展示MVP和GWT是如何结合在一起的,但是://

您是自己编写源代码还是运行Contacts2.zip文件中提供的代码?我运行Contacts2.zip代码。没有任何更改。