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

时间:2010-08-03 18:55:13

标签: gwt

我最近尝试关注Large scale application development and MVP tutorial。这个教程很棒,但我很难做一些事情。

如果您尝试将联系人添加到列表,则会创建联系人。如果您尝试添加其他联系人,则会转到您创建的最后一个联系人的编辑屏幕。添加第一个联系人后,无法再添加联系人。需要更改的内容,以便您可以添加多个联系人。

我试图让它发挥作用的改变:

每次按下添加按钮时,

创建一个新的editContactsView。这会打开一个空白的编辑屏幕,但新的联系人仍会覆盖之前的添加。

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

2 个答案:

答案 0 :(得分:6)

实际上,有一些问题(我可以看到):

  • 与已提及的Lumpy一样,通过Contact创建的新EditContactPresenter未获得指定的ID(null)。这是因为EditContactPresenter使用了未设置id的默认Contact()构造函数。有许多可能的解决方案:在默认构造函数中添加设置id(这样您就不必跟踪应用程序中其他位置的ID),将该功能委托给您的服务器(例如,创建您的数据库)生成下一个可用ID并将其发回(或)只需在contact.setId(whatever);
  • 中的相应位置添加EditContactsPresenter
  • AppController.java:134 - 此示例重用视图(这是一个好主意),如果您使用它来创建新的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");        
        }    
    });  
}