Java 如何根据上一个组合框的内容更改组合框的内容?

Java 如何根据上一个组合框的内容更改组合框的内容?,java,wicket,Java,Wicket,我有一个包含两个组合框的页面。我想让它们成为这样,当我更改第一个组合框时,第二个组合框的内容(从数据库中获取)也会更改。我该怎么做呢?执行此类操作的常用方法是通过AJAX。您可以轻松地将AJAX行为添加到第一个DropDownChoice,以填充/刷新第二个DropDownChoice的选项 假设您正在使用IModels来获得DropDownChoices这两个选项。获取第二个DropDownChoice选项的IModel将使用第一个DropDownChoice的ModelObject(因为它是

我有一个包含两个组合框的页面。我想让它们成为这样,当我更改第一个组合框时,第二个组合框的内容(从数据库中获取)也会更改。我该怎么做呢?

执行此类操作的常用方法是通过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”部分很有趣。

执行此类操作的常用方法是通过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);
    }
}