2011-07-26 19 views
3

在Wicket中,我想子類TextField表單組件添加額外的標記標籤。修改Wicket FormComponent沒有面板的標記?

爲什麼我不希望創建面板:

1)我想要的網頁設計師使用的輸入標籤: <input wicket:id="blah">

2)我不想子類失去Java中的FormField語義,例如: field.setRequired(true);等。

我很好用硬編碼Java中的包裝標記。但我希望這表現得像Java中的FormField。

任何想法?看看周圍的例子,但難住這一個

編輯: 我知道邊界,但我與他們的問題是你必須在標記和Java中添加它們。例如:

<div wicket:id="border"> 
<input type="text" wicket:id="field"/> 
</div> 

-

FormComponent<Integer> field = new TextField<Integer>("field", new Model(1)); 
field.setRequired(true); 
Border border = new MyBorder("border"); 
border.add(field); 
form.add(border); 

這使得網頁設計者必須意識到特殊的標記,而Java不能被封裝(作爲FormField子類)。

+0

請問爲什麼設計師不應該知道特殊標記? – buritos

+0

曾經有一段時間,但基本上讓設計師只處理wicket:id屬性,而不必擔心Wicket的特殊方式嵌套塊。 – 7zark7

回答

3

啊,這是我通過IBehavior想:

我的包裝的行爲(遺憾的斯卡拉語法):

class FieldWrapper extends AbstractTransformerBehavior { 
    def transform(component: Component, output: CharSequence): CharSequence = """ 
<div class="blah"> 
    Blah blah blah 
    %s 
</div> 
""".format(output) 
} 

我的子類:

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> 

謝謝S.O.爲了啓動我的腦海:-)

+1

是的。行爲就是你需要的。使用它的beforeRender()和afterRender()更簡單的行爲將會滿足你的需求。 –

+0

@ martin-g:當通過調用AjaxRequestTarget.add更新formComponent時,會不會導致重複(和嵌套)標記(之前和之後)? –

+1

@AnthonyWebster爲此,您可以使用org.apache.wicket.ajax.IAjaxRegionMarkupIdProvider。看到它的javadoc。 –

0

如果挖掘到一個組件的渲染需要

MarkupContainer#onRender() 

是你的朋友。

一個例子可能是:

AbstractTree#onRender() 

MF

2

你甚至不會需要繼承文本字段。儘管如果你想重複使用它可能會更容易。如果您只是想在原始標籤之外添加標記,那麼這是Border的海報用例。

+0

請參閱我上面的編輯,我已經嘗試過邊界,但不符合我的需求(假設我正確使用它們)。 – 7zark7