Java 如何根据上一个组合框的内容更改组合框的内容?
我有一个包含两个组合框的页面。我想让它们成为这样,当我更改第一个组合框时,第二个组合框的内容(从数据库中获取)也会更改。我该怎么做呢?执行此类操作的常用方法是通过AJAX。您可以轻松地将AJAX行为添加到第一个Java 如何根据上一个组合框的内容更改组合框的内容?,java,wicket,Java,Wicket,我有一个包含两个组合框的页面。我想让它们成为这样,当我更改第一个组合框时,第二个组合框的内容(从数据库中获取)也会更改。我该怎么做呢?执行此类操作的常用方法是通过AJAX。您可以轻松地将AJAX行为添加到第一个DropDownChoice,以填充/刷新第二个DropDownChoice的选项 假设您正在使用IModels来获得DropDownChoices这两个选项。获取第二个DropDownChoice选项的IModel将使用第一个DropDownChoice的ModelObject(因为它是
DropDownChoice
,以填充/刷新第二个DropDownChoice
的选项
假设您正在使用IModel
s来获得DropDownChoice
s这两个选项。获取第二个DropDownChoice
选项的IModel
将使用第一个DropDownChoice
的ModelObject(因为它是依赖的)
您可以将附加到第一个下拉选项
。它将在
标记上输出一个onchange
HTML事件处理程序,这样它将用所选的值更新DropDownChoice
的模型对象,然后调用您的行为。在onUpdate()
方法中,您只需将第二个DropDownChoice
添加到中,就可以通过ajax响应使用更新的选项将其写回。请记住在将要添加到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
对象),您只需要在onUpdate
方法中获取新的List
,并使用将其设置为ddcCity
。您可以使用该方法获取行为绑定到的组件
如果您想支持没有javascript的用户,您应该添加一个submit按钮(可能在
标记?)并禁用默认的from processing,然后在按钮的onSubmit
中执行相同的逻辑
如需更多参考,请参阅Wicket wiki页面,您可能会发现“Ajax”部分很有趣。执行此类操作的常用方法是通过Ajax。您可以轻松地将AJAX行为添加到第一个DropDownChoice
,以填充/刷新第二个DropDownChoice
的选项
假设您正在使用IModel
s来获得DropDownChoice
s这两个选项。获取第二个DropDownChoice
选项的IModel
将使用第一个DropDownChoice
的ModelObject(因为它是依赖的)
您可以将附加到第一个下拉选项
。它将在
标记上输出一个onchange
HTML事件处理程序,这样它将用所选的值更新DropDownChoice
的模型对象,然后调用您的行为。在onUpdate()
方法中,您只需将第二个DropDownChoice
添加到中,就可以通过ajax响应使用更新的选项将其写回。请记住在将要添加到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
对象),您只需要在onUpdate
方法中获取新的List
,并使用将其设置为ddcCity
。您可以使用该方法获取行为绑定到的组件
如果您想支持没有javascript的用户,您应该添加一个submit按钮(可能在
标记?)并禁用默认的from processing,然后在按钮的onSubmit
中执行相同的逻辑
如需更多参考,请参阅Wicket wiki页面,您可能会发现“Ajax”部分很有趣。非常感谢您提供完整的答案,我是Wicket的粉丝!:-)@努辛卡基很高兴这是有用的:-)在这个例子中,也许让DropDownChoices
作为private
成员不是最好的选择。此外,您应该在页面上的/组件上调用detach()
,以分离选项LoadableDetachableModel
,避免在页面映射中序列化它们。非常感谢您的完整答案,我是Wicket的粉丝:-)@努辛卡基很高兴这是有用的:-)在这个例子中,也许让DropDownChoices
作为private
成员不是最好的选择。此外,您应该在页面上的/组件上调用detach()
,以便分离选项LoadableDetachableModel
,避免在页面映射中序列化它们。
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);
}
}