読者です 読者をやめる 読者になる 読者になる

2つのDropDownChoice 変更イベント

Wicket で、2つのDropDownChoice を配置して、一方を選択したイベントでもう片方の DropDownChoice のリスト内容を書き換え、さらに書き換えた後の選択イベント
=つまり2つとも、選択イベントを配置した時、
2個目を変化(選択)した時に、

Attempt to set model object on null model of component
というメッセージのエラーが発生してハマった。

言われるとおりに変更された時に、null の Modelオブジェクトをセットしてエラーを回避できたけど、
何で?の疑問は消えない。

final DropDownChoice<Category> selectCategory = new DropDownChoice<Category>("selectCategory"
, new Model<Category>(), logic.getCategoryList()
, new IChoiceRenderer<Category>(){
    @Override
    public Object getDisplayValue(Category c){
       return c.categoryNname;
    }
    @Override
    public String getIdValue(Category c,int index){
       return Integer.toString(c.id);
    }
});

final DropDownChoice<Item> selectItem = new DropDownChoice<Item>("selectItem"
new PropertyModel<List<Item>>(this, "items")
, new IChoiceRenderer<Item>(){
    @Override
    public Object getDisplayValue(Item i){
       return i.itemName;
    }
    @Override
    public String getIdValue(Item i, int index){
       return Integer.toString(i.id);
    }
});
selectItem.setOutputMarkupId(true);

selectCategory.add(new OnChangeAjaxBehavior(){
    @Override
    protected void onUpdate(AjaxRequestTarget target){
       selectItem.setModel(new Model<Item>());  //・・・この1行が必要

       // PropertyModel とした Pageクラス属性として持たせる Item のリスト、items を改めてセットする。
       setItems(selectCategory.getModelObject().id);
       // 再表示、反映させる。
       target.add(selectItem);
    }
});

/* 上の、 selectItem.setModel を書かずに、OnChangeAjaxBehavior を書くと
 * Attempt to set model object on null model of component のエラーになる!!
 */

selectItem.add(new OnChangeAjaxBehavior(){
    @Override
    protected void onUpdate(AjaxRequestTarget target){
      :
      :