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){
:
: