【问题标题】:Subcomponent not updating on dropdown selection via onConfigure子组件未通过 onConfigure 更新下拉选择
【发布时间】:2021-06-02 14:08:44
【问题描述】:

我有一个下拉列表,根据选择,更新页面上的一些免责声明文本。下拉列表和免责声明都是其自己的面板(自己的标记和组件)。我想让它在第一次加载页面时不显示免责声明。每当从下拉列表中进行选择时,都会显示免责声明。

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", 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 );

        }

DisclaimerPanel.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 第一次运行并正确隐藏了免责声明。当我做出选择时;但是,DisclaimerPanelfirstTimeLoadedfalseonConfigure 的构造函数不会被执行。我错过了什么?

提前致谢!

【问题讨论】:

  • 您使用的是什么 Wicket 版本?如果是 8 或者从不,AjaxFormComponentUpdatingBehavior( "onchange") 需要改为AjaxFormComponentUpdatingBehavior( "change")。自 wicket 6.0 以来,他们对其进行了更改,因此您不再需要事件名称中的前导“on”。直到 wicket 8 他们都支持,因为 wicket 8.0 不再支持领先的“on”。
  • @OHGODSPIDERS 我相信它是版本 4 (1.4.23)

标签: java wicket


【解决方案1】:

无需在 onUpdate() 中创建 DisclaimerPanel 的新实例。您只需切换其firstTimeLoaded 值,然后将disclaimerPanel 添加到AjaxRequestTarget。您可以将 firstTimeLoaded 的设置器添加到 DisclaimerPanel,或者使用 IModel&lt;Boolean&gt; 而不是普通的 boolean 作为构造函数参数。

在您创建新实例的代码中,您需要将旧实例替换为:replace(disclaimerPanel)。这是必需的,因为在 Wicket 中,页面就像一个树数据结构 - 页面是根,它可能有分支 - 它的第一级组件,并且它们可能有自己的分支 - 它们的子组件等。所以在这里你创建 DisclaimerPanel 的新实例,但您不将其添加到任何父组件。您需要使用parent.replace(disclaimerPanel),然后将disclaimerPanel 添加到AjaxRequestTarget,以便Wicket 在Ajax 响应中呈现其HTML。

【讨论】:

  • 抱歉,我已经编辑了问题。我添加了 firstTimeLoaded = false; addOrReplace( autodepositPanel ); 并从 METHOD 1 中删除了这些行,但它仍然不起作用。我在原始代码中将disclaimerPanel 添加到了AjaxRequestTarget。这和addOrReplace有什么区别?
猜你喜欢
  • 2021-11-16
  • 1970-01-01
  • 1970-01-01
  • 2011-12-30
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多