WICKET:控制组件在更改 CheckBox 时的可见性

Posted

技术标签:

【中文标题】WICKET:控制组件在更改 CheckBox 时的可见性【英文标题】:WICKET: Control visibility of components on change CheckBox 【发布时间】:2014-10-14 20:16:46 【问题描述】:

我正在使用检票口框架。 有谁知道如何通过单击复选框组件来控制表单中组件的可见性,以及如何在提交表单时获取复选框状态的布尔值(真或假,取决于选中与否)。 我想做这样的事情:

TextField nameField = new TextField("name");

public StateDB() 
final AjaxCheckBox searchByFio = new AjaxCheckBox("searchByFio", new PropertyModel(this, "checkBoxValue")) 
            @Override
            protected void onUpdate(AjaxRequestTarget target) 
                nameField.setVisible(checkBoxValue);
                target.add(nameField);
            
        ;

Form form = new Form("form");

nameField.setOutputMarkupPlaceholderTag ( true );
form.add(nameField);
add(form);

但结果不是我所期望的。它只是像这样更改 html 元素 来自:

<input type="text" wicket:id="lastName" id="lastName" required="" value="" name="lastName">

致:

<input id="lastName" style="display:none">

反之亦然

【问题讨论】:

我错了,wicket 只是改变了组件的样式。但是使用这种样式的用户无法在页面上看到您的文本字段。这是隐藏组件的正常行为。 Wicket 必须知道你的对象下次必须出现在哪里,所以它只是改变它的样式。但是如果你真的想出于某种原因删除输入,那么你必须用 WebMarkupContiner 包装它或用另一个组件替换它,比如 EmptyPanel。如果你愿意,我可以教你怎么做。 是的,如果您展示如何使用 WebMarkupContiner 包装器,那就太好了。我还没有将我想通过复选框控制其可见性的组件分离到另一种形式。并控制该表单的可见性。但我认为这是错误的方式 已更新我的答案。 【参考方案1】:

要通过单击复选框来更新任何组件的可见性,您可以使用“AjaxCheckBox”,例如:

//somewhere in the class create model variable:
boolean checkBoxValue = true;

//this is your hideable component
Label someComponent;

...
//and add PropertyModel for checkbox:
AjaxCheckBox checkBox = new AjaxCheckBox("checkBox", new PropertyModel(this, "checkBoxValue")) 
        @Override
        protected void onUpdate(AjaxRequestTarget target) 
                //if checkbox is checked, then our component is shown
                someComponent.setVisible(checkBoxValue);
                target.add(someComponent);
        
;

...
//this is your component to update
someComponent = new Label("someComponent", "some text");

//this method allows you to hide/show component with ajax updates.
someComponent.setOutputMarkupPlaceholderTag ( true );

要在提交后获得复选框值 - 您可以检查您的 checkBoxValue 值。

更新

实际上你可以重写你的可隐藏组件方法onConfigure() 来根据'checkBoxValue'设置它的可见性(这只是获得它的另一种方法,可能更受欢迎):

   someComponent = new Label("someComponent", "some text")
   
       @Override
       protected void onConfigure() 
          setVisible ( checkBoxValue ); 
       
   ;

如果你这样做,那么你可以从AjaxCheckBox#onUpdate()方法中删除someComponent.setVisible(checkBoxValue);代码

更新 2

Component WebMarkupContainer 允许你包装一些组件。而当它隐藏时——那么它们就真的从标记中删除了。但是容器的标记无论如何都会以display:hidden 样式存在。

在某处创建容器:

WebMarkupContainer container = new WebMarkupContainer ( "cont" );
//we will hide this container, so we can replace  someComponent.setOutputMarkupPlaceholderTag ( true ); by this
container.setOutputMarkupPlaceholderTag ( true );

将容器添加到表单中:

form.add(container);

将我们的someComponent 添加到此容器中:

container.add(someComponent);

并在AjaxCheckBox#onUpdate() 方法中使用ajax 更新容器:

protected void onUpdate(AjaxRequestTarget target) 
    //if checkbox is checked, then our component is shown
    container.setVisible(checkBoxValue);
    target.add(container);

在 html 代码中是这样的

  <div wicket:id="cont">
      <input type="text" wicket:id="someComponent"/>
  </div>

您可以将任意数量的组件添加到此类容器中,并且可以使用它来管理它们。

【讨论】:

我尝试处理第一个示例,但没有得到预期的结果。结果是:当我点击复选框时,它只是改变了文本字段元素的样式 你做错了什么。我已经用 TextField 尝试了这个例子,它也可以工作。用您实现的代码更新您的问题。 这是我的荣幸。我已经评论了你的问题。 Wicket 的一大缺点是通常会在标签内放置一个复选框以使其正确显示,但 wicket 不允许您向标签添加任何组件。

以上是关于WICKET:控制组件在更改 CheckBox 时的可见性的主要内容,如果未能解决你的问题,请参考以下文章

Java:如何将值从javascript设置为wicket组件文本字段

是否可以更改 Wicket 活动指示器的颜色?

使用 Ajax 填充 Wicket 表

Wicket中表单组件的国际化标签

在 wicket 中,如何创建未由组件层次结构/布局定义的 RadioGroup?

如何对自定义 Wicket 组件进行单元测试