3

当TextField及其周围的FormComponentPanel使用相同的模型时,我真的很想了解为什么以下代码的模型对象始终为空:

public class MyPanel extends FormComponentPanel<String> {

    private TextField<String> _field;

    public MyPanel(String id, IModel<String> model) {
        super(id, model);
        _field = new TextField<String>("field", model);
        add(_field);
    }


}

我知道我可以通过覆盖 Javadocs 中描述的 Panel 的 convertInput 来解决这个问题:

@Override   
protected void convertInput() {
    setConvertedInput(_field.getConvertedInput());
}

我真的很想了解为什么 TextField 的更改不会像我期望的那样更新模型:将模型对象设置为用户的输入。

4

1 回答 1

4

正如“Wicket in Action”所说:

在组件验证的第一阶段(在执行任何验证器之前)调用 convertInput 方法。实现应该解析用户输入并使用 setConvertedInput 设置转换后的输入,或者报告输入无法直接解释。表单组件面板通常不直接接收用户输入。但是因为它的嵌套组件会这样做,并且因为它想相应地更新自己的模型值,所以我们重写了这个方法。

在您的示例中,最初将调用文本字段的 convertInput 方法。它将使用正确的值更新共享模型。

然后会调用表单组件面板的convertInput方法。但是因为表单组件面板不直接接收任何输入,所以它的 getInputAsArray 方法将返回 null (如果输入在您的情况下可以为空)。所以共享模型将再次更新,这次是空值,模型的结果值最终将为空。

于 2012-11-07T05:08:53.077 回答