2012-03-22 46 views
0

我在GWT中构建动态表单,但我不确定如何在提交时动态检索值。GWT中的动态表格

我读从DB问题的数据和手动构建被添加到一个FormPanel元素:

@UiField 
    FormPanel formPanel; 

    @Override 
    protected void onLoad() 
    { 
     service.getFields(AysncCallbak<Fields> callback) 
     { 
      public void onSuccess(Fields result) 
      { 
       for(Object yo : fields.stuff()) 
       { 
        Element div = DOM.createDiv(); 
        div.appendChild(DOM.createInputText()); 
        formPanel.getElement().appendChild(div); 
       } 
      } 
     } 
    } 

这是在伪码的要点,但我不知道如何后检索值这点。

我想序列化表单(获取HTML)并用DOM解析它,但GWT生成无效的XHTML(输入标记未终止,导致解析失败)。

我可以发送数据到一个Servlet,但还有更多我需要的东西(其他隐藏的输入字段等)。

大多数GWT表单示例非常简单,或者声明了明确的字段。我应该看看第三方图书馆吗?我如何获得动态值?

回答

1

GWT不是JSP。不是PHP。

使用FormPanel适用于初学者,或与现有表单处理servlet兼容,或用于快速和肮脏的任务。我不得不承认,我可能已经忘记了如何使用表单面板。

一旦您了解了Forms的速度,您可能希望转移到RPC,RequestBuilder或RES以将您的数据提交给服务器。

首先,在GWT中,除非绝对必要(例如调整JSNI的行为),否则应该避免获取小部件的元素。

以下是一些可能不太精确的代码,但它可以让人想到。

protected void onLoad() { 
    HashMap<String, Widget> formWidgetHash = new HashMap<String, Widget>(); 
    FlexTable table = new FlexTable(); 
    FormPanel form = new FormPanel(); 
    form.setWidget(table); 

    service.getFields(AysncCallbak<Fields> callback) { 
    public void onSuccess(Fields result) { 
     int i = 0; 
     for(Object yo : fields.stuff()) { 
     mkFormWidget(formWidgetHash, table, i++, yo); 
     } 
    } 
    } 
} 

你可以记住在HashMap中的表单。您可以通过HashMap来查看这些值。

但你不必这样做。只需提交表格。该表单将解析字段。

private void mkFormWidget(
    HashMap formWidgetHash, FlexTable table, int row, Object yo) { 

    // LHS of table is field prompt 
    String prompt = resolvePrompt(yo); 
    table.setText(row, 0, prompt); 
    Widget formWidget; 
    if (yo instanceof Boolean){ 
    formWidget = new CheckBox(); 
    } 
    else { ... 
    } 
    else { ... 
    } 
    else { 
    formWidget = new TextBox(); 
    } 

    table.setWidget(row, 1, w); 
    formWidgetHash.put(prompt, w); 
} 

abstract protected String resolvePrompt(Object o); 

我不明白为什么你需要在发送表单到服务器之前访问小部件。如果您需要添加字段验证程序,则应在mkFormWidget中实例化它时将其添加到表单窗口小部件中。

但是,如果您希望具有位置以及对窗体小部件的散列键访问权限,则可以按照此问题中的答案:Maps (collection) that maintains insertion Order in java

+0

希望有人读这个评论,而不是那个“答案”。经验教训:不要显式操纵DOM,使用容器小部件,并存储对问题小部件的引用。 – hisdrewness 2012-03-26 20:59:52