我在TextComponentPanel中放置一个TextField和一个DropDownChoice,它应该使用setConvertedInput与TextDield的值连接DropDownChoice的值。但是,我想将FormComponentPanel的标记放在包含包含表单的标记文件中的wicket:fragment中。
这是我迄今为止所尝试的版本的缩略版:
... some stuff not shown here ...
DurationFormComponentPanel durationFormComponentPanel = new DurationFormComponentPanel("estimated_duration");
add(new Fragment("estimatedDuration", "duration_fragment", OptionsPanel.this));
<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的标记为空。
答案 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);