Java 子组件未通过onConfigure更新下拉选择
我有一个下拉列表,根据选择,更新页面上的一些免责声明文本。下拉列表和免责声明都是自己的面板(自己的标记和组件)。我想让第一次加载页面时,不显示免责声明。无论何时从下拉列表中进行选择,免责声明都会显示 DropDownPanel.javaJava 子组件未通过onConfigure更新下拉选择,java,wicket,Java,Wicket,我有一个下拉列表,根据选择,更新页面上的一些免责声明文本。下拉列表和免责声明都是自己的面板(自己的标记和组件)。我想让第一次加载页面时,不显示免责声明。无论何时从下拉列表中进行选择,免责声明都会显示 DropDownPanel.java private boolean firstTimeLoaded = true; ... disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTim
private boolean firstTimeLoaded = true;
...
disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTimeLoaded );
disclaimerPanel.setOutputMarkupId( true );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );
...
dropDownChoice.getInternalComponent().add( new AjaxFormComponentUpdatingBehavior( "onchange" )
{
@Override
protected void onUpdate( AjaxRequestTarget ajaxRequestTarget )
{
// METHOD 1
disclaimerPanel = new Disclaimer( "disclaimer", contactModel, !firstTimeLoaded );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );
disclaimerPanel.setOutputMarkupId( true );
// METHOD 2
// remove code from METHOD 1 as onConfigure should set visibility of DisclaimerPanel using addComponent
ajaxRequestTarget.addComponent( disclaimerPanel );
ajaxRequestTarget.addChildren( disclaimerPanel, Component.class );
}
private boolean firstTimeLoaded;
public DisclaimerPanel( String id, IModel<Contact> contactModel, boolean firstTimeLoaded )
{
...
this.firstTimeLoaded = firstTimeLoaded;
}
@Override
protected void onConfigure()
{
setVisible( !firstTimeLoaded );
}
免责声明面板.java
private boolean firstTimeLoaded = true;
...
disclaimerPanel = new DisclaimerPanel( "disclaimer", contactModel, firstTimeLoaded );
disclaimerPanel.setOutputMarkupId( true );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );
...
dropDownChoice.getInternalComponent().add( new AjaxFormComponentUpdatingBehavior( "onchange" )
{
@Override
protected void onUpdate( AjaxRequestTarget ajaxRequestTarget )
{
// METHOD 1
disclaimerPanel = new Disclaimer( "disclaimer", contactModel, !firstTimeLoaded );
disclaimerPanel.setOutputMarkupPlaceholderTag( true );
disclaimerPanel.setOutputMarkupId( true );
// METHOD 2
// remove code from METHOD 1 as onConfigure should set visibility of DisclaimerPanel using addComponent
ajaxRequestTarget.addComponent( disclaimerPanel );
ajaxRequestTarget.addChildren( disclaimerPanel, Component.class );
}
private boolean firstTimeLoaded;
public DisclaimerPanel( String id, IModel<Contact> contactModel, boolean firstTimeLoaded )
{
...
this.firstTimeLoaded = firstTimeLoaded;
}
@Override
protected void onConfigure()
{
setVisible( !firstTimeLoaded );
}
private boolean firsttimeload;
公共免责声明面板(字符串id、IModel contactModel、布尔值firstTimeLoaded)
{
...
this.firstTimeLoaded=firstTimeLoaded;
}
@凌驾
配置()上受保护的空
{
setVisible(!firstTimeLoaded);
}
我尝试了两种方法,但都不起作用(方法1,方法2)。在断点中,onConfigure
第一次运行并正确隐藏免责声明。当我做出选择时;但是,DisclaimerPanel
的构造函数将firstTimeLoaded
设置为false
,但不会执行onConfigure
。我错过了什么
提前谢谢 无需在onUpdate()中创建新的免责声明面板实例。您只需切换其
firstTimeLoaded
值,然后将disclaimerPanel
添加到AjaxRequestTarget。您可以将firstTimeLoaded
的setter添加到DisclaimerPanel,或者使用IModel
而不是普通的布尔值
作为构造函数参数
在创建新实例的代码中,需要将旧实例替换为:
replace(disclaimerPanel)
。这是必要的,因为在Wicket中,页面就像一个树数据结构——页面是根,它可能有分支——它的第一级组件,它们可能有自己的分支——它们的子组件,等等。因此,这里您创建了一个新的免责声明面板实例,但不将其添加到任何父组件中。您需要使用parent.replace(disclaimerPanel)
,然后将disclaimerPanel
添加到AjaxRequestTarget,以便Wicket在Ajax响应中呈现其HTML。您使用的Wicket版本是什么?如果是8或从不ajaxformcomponentupdatebehavior(“onchange”)
需要更改为ajaxformcomponentupdatebehavior(“change”)
。自wicket 6.0以来,他们对其进行了更改,因此您不再需要事件名称中的前导“on”。直到wicket 8之前,他们都支持这两个版本,因为wicket 8.0的开头“on”不再受支持。@哦,我相信它是版本4(1.4.23)。对不起,我已经编辑了这个问题。我添加了firstTimeLoaded=false代码>添加或替换(自动存储面板)
并从方法1中删除了行,但它仍然不起作用。我在原始代码中将免责声明面板
添加到AjaxRequestTarget中。这与添加或替换
有什么区别?我也更新了我的答案。