我有一个包含两个组合框的页面。我想以这样的方式制作它们:当我更改第一个组合框时,第二个组合框的内容(从数据库中获取)会被更改。我该怎么办?
答案 0 :(得分:4)
执行此类操作的常用方法是通过AJAX。您可以轻松地向第一个DropDownChoice
添加AJAX行为,以便填充/刷新第二个DropDownChoice
的选项。
假设您正在使用IModel
来获取DropDownChoice
的两个选项。获得第二个IModel
选项的DropDownChoice
将使用第一个DropDownChoice
的ModelObject(因为它依赖于它)。
private DropDownChoice ddcCountry;
private DropDownChoice ddcCity;
//...
IModel countriesModel = new LoadableDetachableModel(){
@Override
protected Object load() {
return myService.getCountries();
}
};
IModel citiesModel = new LoadableDetachableModel(){
@Override
protected Object load() {
if (ddcCountry.getModelObject() != null){
return myService.getCities(ddcCountry.getModelObject());
}
else { return new ArrayList(); }
}
};
ddcCountry = new DropDownChoice("country", null, countriesModel);
ddcCity = new DropDownChoice("city", null, citiesModel);
您可以将AjaxFormComponentUpdatingBehavior
附加到第一个DropDownChoice
。这将在onchange
标记上输出<select>
HTML事件处理程序,以便它将使用所选值更新DropDownChoice
的模型对象,然后调用您的行为{{3 }}。在onUpdate()
方法中,您只需将第二个DropDownChoice
添加到onUpdate()
,然后通过带有更新选项的ajax响应将其写回。请务必对要添加到AjaxRequestTarget
的所有组件使用AjaxRequestTarget
。
例如,对于国家和城市的2个相关选择:
ddcCity.setOutputMarkupId(true);
ddcCountry.add(new AjaxFormComponentUpdatingBehavior(){
@Override
protected void onUpdate(AjaxRequestTarget target) {
// here, ddcCountry's ModelObject has been already updated.
ddcCity.setModelObject(null); // clear selection
if (target != null) {
// Adding the ddc to the AjaxRequestTarget will write
// it back to the ajax response with new options pulled
// from the choices model.
target.addComponent(ddcCity);
}
}
}
如果您没有使用IModels
作为选择(即在构造函数中使用List
个对象),您只需要在{{{{}}中获取新的List
1}}方法,并使用setOutputMarkupId(true)
将其设置为onUpdate
。您可以使用setChoices()
方法获取ddcCity
行为受限制。
Component
如果你想支持没有javascript的用户,你应该添加一个提交按钮(可能在protected void onUpdate(AjaxRequestTarget target) {
// here, ddcCountry's ModelObject has been already updated.
List cities = myService.getCities(getComponent().getModelObject());
ddcCity.setChoices(cities);
ddcCity.setModelObject(null); // clear selection
if (target != null) {
target.addComponent(ddcCity);
}
}
标签?),默认处理已禁用,并在按钮<noscript>
中执行相同的逻辑
有关其他参考信息,请参阅此getComponent()
Wicket wiki页面,您可能会发现“Ajax”部分很有趣。