如何解决子组件未通过 onConfigure 更新下拉选择
我有一个下拉菜单,根据选择,更新页面上的一些免责声明文本。下拉菜单和免责声明都是自己的面板(自己的标记和组件)。我想让它在第一次加载页面时不显示免责声明。无论何时从下拉列表中进行选择,都会显示免责声明。
DropDownPanel.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",!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 );
}
免责声明Panel.java
private boolean firstTimeLoaded;
public disclaimerPanel( String id,IModel<Contact> contactModel,boolean firstTimeLoaded )
{
...
this.firstTimeLoaded = firstTimeLoaded;
}
@Override
protected void onConfigure()
{
setVisible( !firstTimeLoaded );
}
我尝试了两种方法,但都不起作用(方法 1、方法 2)。从断点来看,onConfigure
第一次运行并正确隐藏了免责声明。当我做出选择时;但是,disclaimerPanel
与 firstTimeLoaded
为 false
但 onConfigure
的构造函数没有执行。我错过了什么?
提前致谢!
解决方法
无需在 onUpdate() 中创建 DisclaimerPanel 的新实例。您只需要切换它的 firstTimeLoaded
值,然后将 disclaimerPanel
添加到 AjaxRequestTarget。您可以将 firstTimeLoaded
的 setter 添加到 DisclaimerPanel,或使用 IModel<Boolean>
而不是普通的 boolean
作为构造函数参数。
在您创建新实例的代码中,您需要将旧实例替换为:replace(disclaimerPanel)
。这是必需的,因为在 Wicket 中,页面就像一个树数据结构——页面是根,它可能有分支——它的第一级组件,它们可能有自己的分支——它们的子组件等等。所以在这里你创建 DisclaimerPanel 的新实例,但不要将其添加到任何父组件。您需要使用 parent.replace(disclaimerPanel)
,然后将 disclaimerPanel
添加到 AjaxRequestTarget,以便 Wicket 在 Ajax 响应中呈现其 HTML。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。