2012-11-06 22 views
3

我真的想明白为什么下面的代码的模型对象总是空,当相同的模型被用于由TextField及其周边FormComponentPanel:为什么FormComponentPanels中的共享模型不起作用?

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); 
    } 


} 

我知道我可以通过重写解决这个问题面板的convertInput,这是JavaDoc中所述:

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

我真的想了解为什么文本域的更改不会更新模型我希望的方式:设置模型对象到用户的输入。

回答

4

为“检票在行动”表示:

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

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

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

+0

因此,TextField的模型更新按预期工作,但表单组件面板会覆盖此值。非常感谢! –