Динамическая форма в GWT - PullRequest
0 голосов
/ 23 марта 2012

Я строю динамические формы в GWT, но я не уверен, как динамически извлекать значения при отправке.

Я читаю данные вопроса из БД и вручную строю добавляемые элементыв 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);
              }
           }
       }
    }

Это суть psuedocode, но я не уверен, как получить значения после этой точки.

Я хочу сериализовать форму (получить HTML) и проанализировать ее с помощью DOM, но GWT выдает недопустимый XHTML (входные теги не завершаются, что приводит к ошибке синтаксического анализа).

Я мог отправитьданные сервлету, но мне нужно гораздо больше (другие скрытые поля ввода и т. д.).

Большинство примеров форм GWT невероятно тривиальны или имеют объявленные явные поля.Стоит ли смотреть на стороннюю библиотеку?Как получить динамические значения?

1 Ответ

1 голос
/ 23 марта 2012

GWT не является JSP.Не PHP.

Использование FormPanel предназначено для начинающих или для совместимости с существующими сервлетами обработки форм, или для быстрых и грязных задач.Я должен признать, я мог бы забыть, как использовать панели форм.

Как только вы освоите формы, вы, вероятно, захотите перейти к RPC, RequestBuilder или RES для отправки ваших данных вserver.

Во-первых, в 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.

Однако, если вы хотите иметь как позиционный, так и хэш-ключ доступа к виджетам формы, вымог следовать за ответом в этом вопросе: Карты (коллекция), которая поддерживает Порядок вставки в Java .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...