Калитка 8 DateTextField (из расширения калитки) - PullRequest
0 голосов
/ 09 мая 2018

У меня есть простой Java-класс, назовем его Person: он содержит, как следует из названия, информацию о человеке. Таким образом, у него есть такие свойства, как имя, фамилия, адрес, пол, номер телефона и мой виновник, день рождения. У меня есть страница, которая позволяет пользователям редактировать эти поля: она состоит из текстового поля с автозаполнением, в котором пользователи могут ввести идентификатор человека или его часть и выбрать человека, которого они хотят редактировать, из раскрывающегося списка. Остальная часть страницы представляет собой список текстовых полей, связанных с моделями Wicket для Person, которого пользователи выбирают из списка: когда это происходит, каждое текстовое поле корректно заполняется свойствами выбранного объекта Person. Краткий пример Java, представляющего текстовые поля и их модель:

private Person person;
[...]
    formPatient = new Form("patientForm", new PropertyModel<>(this, "person"));
[...]
    formPatient.add(tmp = new MyTextField<>("nome", new PropertyModel<>(this, "person.nome")));
    formPatient.add(tmp = new MyTextField<>("secondoNome", new PropertyModel<>(this, "person.secondoNome")));
    formPatient.add(tmp = new MyTextField<>("cognome", new PropertyModel<>(this, "person.cognome")));
    DropDownChoice sessoDDC = new DropDownChoice("sesso", new PropertyModel<>(this, "person.sesso"), Arrays.asList(Enums.Sex.values()));
    formPatient.add(sessoDDC);
    formPatient.add(dtf = new DateTextField("bday", new PropertyModel<Date>(this, "person.bday"), "dd/MM/yyyy"));
[...]

Это прекрасно работает, как я уже сказал. Но для поля дня рождения мне нужно использовать текстовое поле с календарем. Это можно легко упорядочить, просто изменив соответствующую разметку HTML с

<input style="display: table-cell;" type="text" wicket:id="bday"/> 

до

<input style="display: table-cell;" type="date" wicket:id="bday"/> 

для того, чтобы иметь удобный и удобный инструмент для выбора даты.

Проблема в том, что, когда для типа HTML установлено значение «date», функция автообновления перестает работать: DateTextField всегда показывает текст по умолчанию «dd / MM / yyyy», а не реальную дату. Все остальные поля все еще обновляются, когда пользователь выбирает человека из списка (даже в раскрывающемся списке, представляющем пол), поэтому механизм модели Wicket все еще работает. Я попытался переопределить методы, оба из PropertyModel и DateTextField, чтобы посмотреть, не потеряется ли в какой-то момент объект модели, связанный с DateTextField, или что-то в этом роде, но он всегда там, хотя он и не представлен. Я также обнаружил, что окончательный HTML-код выглядит так:

<input style="display: table-cell;" type="text" wicket:id="bday" value="01/01/2011" name="bday">

поэтому информация о дате имеется, даже если само текстовое поле, кажется, не может ее отобразить.

Любая помощь приветствуется. Если вам нужно больше информации или кода, просто дайте мне знать.

Ответы [ 2 ]

0 голосов
/ 10 мая 2018

Сегодня я реализовал TextField, который использует html5 input type = "date" и сохраняет даты в Java 8 LocalDate - пока все работает. Вот реализация - может быть, она вам пригодится:

public class Html5LocalDateField extends TextField<LocalDate> {

   public Html5LocalDateField(String id, IModel<LocalDate> model) {
      super(id, model);
      add(AttributeModifier.replace("type", "date"));
   }

   @Override
   public IConverter getConverter(Class type) {
      return new IConverter<LocalDate>() {
         private static final long serialVersionUID = -986861910933163601L;

         @Override
         public LocalDate convertToObject(String value, Locale locale) {
            return LocalDate.parse(value, DateTimeFormatter.ISO_DATE);
         }

         @Override
         public String convertToString(LocalDate date, Locale locale) {
            return date.format(DateTimeFormatter.ISO_DATE);
         }
      };
   }

}
0 голосов
/ 09 мая 2018

Согласно https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date значение должно использовать - в качестве разделителя между месяцем, днем ​​и годом.

...