【问题标题】:Wicket 8 DateTextField (from wicket-extension)检票口 8 DateTextField(来自检票口扩展)
【发布时间】:2023-03-17 00:53:01
【问题描述】:

我有一个简单的 Java 类,我们将其命名为 Person:顾名思义,它包含关于一个人的信息。所以它有名字,姓氏,地址,性别,电话号码和我的罪魁祸首,生日等属性。 我有一个允许用户编辑这些字段的页面:它由一个自动完成的文本字段组成,用户可以在其中输入人员 ID 或其中的一部分,并从下拉列表中选择他们想要编辑的人员。页面的其余部分是与 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 类型设置为“日期”时,自动更新功能停止工作: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">

所以日期信息在那里,即使文本字段本身似乎无法显示它。

感谢任何帮助。如果您需要更多信息或更多代码,请告诉我。

【问题讨论】:

    标签: date wicket textfield models


    【解决方案1】:

    我今天实现了一个 TextField,它使用 html5 输入 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);
             }
          };
       }
    
    }
    

    【讨论】:

    【解决方案2】:

    根据https://developer.mozilla.org/en-US/docs/Web/HTML/Element/input/date,该值应使用- 作为月、日和年之间的分隔符。

    【讨论】:

    • 我尝试将模式 "dd-MM-yyyy" 作为模式传递给 DateTextField 构造函数:该字段仍然显示带有斜杠的默认空值 ("dd/MM /yyyy"),但呈现的 HTML 是 。无论如何感谢您的提示。
    • 也许我之前不太清楚。尽管已将分隔符更改为 -,但自动更新功能仍然不起作用,即使新模式似乎被正确使用,如呈现的 HTML 所示。
    • 正如链接 martin-g 所指的那样,尝试使用模式 yyyy-MM-dd: "[...] 而日期值的格式始终为 yyyy-mm-dd。"
    • 我不记得严格(一年前编码),波兰语设置中的 Wicket 日期组件(带有日历图标)似乎在键盘/鼠标操作中有细微差别。键盘打字有更宽的“接受格式范围”,鼠标点击窄(或反向)。一般同意你@martin-g。最好是文档化
    • 我的错,没有注意到链接 martin-g 建议颠倒字段顺序。我刚刚实现了它,它似乎工作正常。感谢@Tekki 帮助我注意。
    猜你喜欢
    • 1970-01-01
    • 2017-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-18
    • 2011-09-13
    • 1970-01-01
    相关资源
    最近更新 更多