如何将Wicket FormComponentPanel的标记放在wicket:fragment中?

时间:2010-04-22 08:57:11

标签: java wicket

我在TextComponentPanel中放置一个TextField和一个DropDownChoice,它应该使用setConvertedInput与TextDield的值连接DropDownChoice的值。但是,我想将FormComponentPanel的标记放在包含包含表单的标记文件中的wicket:fragment中。

这是我迄今为止所尝试的版本的缩略版:

OptionsPanel.java

... some stuff not shown here ...
DurationFormComponentPanel durationFormComponentPanel = new DurationFormComponentPanel("estimated_duration");
add(new Fragment("estimatedDuration", "duration_fragment", OptionsPanel.this));

OptionsPanel.html

<span wicket:id='estimatedDuration'></span>
<wicket:fragment wicket:id='duration_fragment'>
<input wicket:id='estimated_duration' value='3' />
<select wicket:id='needed_time_unit'>
    <option>weeks</option>
    <option>days</option>
</select>
</wicket:fragment>

此atm的最终结果是FormComponentPanel的标记为空。

2 个答案:

答案 0 :(得分:1)

我不确定作为片段做起来会有多容易。我经常通过覆盖onComponentTagBody来扩展FormComponentPanel并将其视为WebmarkupContainer,如下所示:

public class CustomFormComponentPanel extends FormComponentPanel {

    public CustomFormComponentPanel(String id) {
        super(id);
        // Various Form Items
    }

    @Override
    protected void onComponentTagBody(final MarkupStream markupStream, final ComponentTag openTag) {
        // Render as a WebMarkupContainer, not a panel
        super.renderComponentTagBody(markupStream, openTag);
    }
}

然后我可以像这样添加我的FormComponentPanel:

add(new CustomFormComponentPanel("custom"));

使用此标记

<span wicket:id="custom">
    <!-- Various form Items -->
</span>

片段的onComponentTagBody()调用Fragment类中的许多私有方法,我认为你必须复制它们。对于一次性,请使用上面的方法。如果你真的需要重新使用它,我会按照原定的意愿使用Panel。

答案 1 :(得分:0)

您必须以这种方式将内部输入组件添加到片段中:

Fragment f = new Fragment("estimatedDuration", "duration_fragment", OptionsPanel.this);
f.add(new TextField("estimated_duration", new Model<String>("3"));
f.add(...);    
[form.]add(f);