是否在没有面板的情况下修改Wicket FormComponent标记?
在Wicket中,我想对TextField表单组件进行子类化,以便在标记周围添加额外的标记 我不想创建面板的原因: 1) 我希望网页设计器使用输入标记:是否在没有面板的情况下修改Wicket FormComponent标记?,wicket,Wicket,在Wicket中,我想对TextField表单组件进行子类化,以便在标记周围添加额外的标记 我不想创建面板的原因: 1) 我希望网页设计器使用输入标记: 2) 我不希望子类丢失Java中的FormField语义,例如: field.setRequired(true),等等 我可以用Java硬编码包装标记。但我希望它的行为类似于Java中的FormField 有什么想法吗?环顾四周寻找例子,但在这一点上遇到了难题 编辑: 我知道边界,但我的问题是必须在标记和Java中添加边界。例如: <d
2) 我不希望子类丢失Java中的FormField语义,例如:
field.setRequired(true)代码>,等等
我可以用Java硬编码包装标记。但我希望它的行为类似于Java中的FormField
有什么想法吗?环顾四周寻找例子,但在这一点上遇到了难题
编辑:
我知道边界,但我的问题是必须在标记和Java中添加边界。例如:
<div wicket:id="border">
<input type="text" wicket:id="field"/>
</div>
--
FormComponent字段=新文本字段(“字段”,新模型(1));
字段。setRequired(true);
边界边界=新的MyBorder(“边界”);
边框。添加(字段);
表格。添加(边框);
这使得网页设计者必须注意特殊的标记,并且Java不能被封装(作为FormField子类)。如果需要深入研究组件的呈现方式
MarkupContainer#onRender()
他是你的朋友
例如:
AbstractTree#onRender()
mf您甚至不需要对TextField进行子类化。尽管如果您想重用它,这样做可能更容易。如果您只想在原始标记之外添加标记,这是一个海报用例。啊,这就是我通过IBehavior想要的:
我的包装行为(对Scala语法感到抱歉):
原始标记:
<input type="text" wicket:id="foobar"/>
生成的标记:
<div class="blah">
Blah blah blah
<input type="text" value="" name="foobar" xmlns:wicket="http://wicket.apache.org">
</div>
废话废话
感谢S.O.启动我的思维:-)请查看我的编辑,我尝试了边框,但不符合我的需要(假设我正确使用了边框)。是的。行为是你需要的。使用beforeRender()和afterRender()的更简单行为可以满足您的需要。@martin-g:当通过调用AjaxRequestTarget.add更新formComponent时,这不会导致重复(和嵌套)标记(之前和之后)吗?@AnthonyWebster为此,您可以使用org.apache.wicket.ajax.IAjaxRegionMarkupIdProvider。看看它的javadoc。@martin-g:太棒了!你(一如既往)是个救命恩人,马丁!我想问一下,为什么设计师不应该知道特殊的标记?已经有一段时间了,但基本上设计师只处理wicket:id属性,而不必为了wicket的缘故担心以特定的方式嵌套块。
class MyField[T](id: String, model: IModel[T]) extends TextField[T](id, model) {
add(new FieldWrapper)
}
<input type="text" wicket:id="foobar"/>
<div class="blah">
Blah blah blah
<input type="text" value="" name="foobar" xmlns:wicket="http://wicket.apache.org">
</div>