3

同じモデルが TextField とその周囲の FormComponentPanel で使用されている場合、次のコードのモデル オブジェクトが常に null である理由を理解したいと思います。

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 を返します (この場合のように入力が null 可能である場合)。そのため、共有モデルは再び更新されますが、今回は null 値であり、モデルの結果の値は最終的に null になります。

于 2012-11-07T05:08:53.077 に答える