2011-01-14 55 views
0

我的表單中有ajaxRadio,但Lift爲我生成了不需要的標記(它用span展開輸入標記,並且我想標記標記)。 它可以覆蓋默認toForm功能或精確覆蓋方法htmlize,這就是所謂覆蓋提升ajaxRadio toForm默認標記

object ChoiceHolder { 
    var htmlize: ChoiceItem[_] => NodeSeq = c => (<span>{c.xhtml} {c.key.toString}<br/> </span>) 
    } 

那麼如何得到的,周圍輸入標籤將標籤和不跨越?

非常感謝。

回答

2

考慮到ChoiceItem是一樣的東西

val choiceItem = ChoiceItem("Some key", <input type="radio" value="val" name="somename" />) 

,並調用toForm方法如下

ChoiceHolder(Seq(choiceItem)).toForm 

你可以使用

ChoiceHolder.htmlize = ci => evalElemWithId((id, e) => e ++ <label for={id}>{ci.key.toString}</label>)(ci.xhtml) 

可能返回類似

NodeSeq(<input name="somename" type="radio" value="val" id="F212153483008MMP"></input>, <label for="F212153483008MMP">Some key</label>) 

,或者,如果你想環繞

ChoiceHolder.htmlize = ci => evalElemWithId((id, e) => <label for={id}>{e} {ci.key.toString}</label>)(ci.xhtml) 

,讓你

NodeSeq(<label for="F689721302326S3S"><input name="somename" type="radio" value="val" id="F689721302326S3S"></input>Some key</label>) 

有點複雜標籤:evalElemWithId(進口net.liftweb.util.Helpers.evalElemWithId)採用NodeSeq的第一個元素(例如choiceItem.xhtml),併爲其添加id屬性。之後,匿名函數將被調用,它將接收此標識,以便您可以在標籤的for屬性中使用它。

編輯 注意ChoiceHolder.htmlize是怎樣的一個全球性的功能將通過所有ChoiceHolder.toForm調用之前調用的。所以如果你想要在任何地方都有相同的佈局,那麼全局改變它就是有意義的。

如果你只是想在一種情況下有一個明確的佈局,你可能更好的只是調用一些choiceToForm方法。

+0

感謝很多幫助,但我不知道如何使用你的代碼。我試圖使用您的ChoiceHolder.htmlize,但編譯器警告我,它不知道evalElemWithId。我找不到寫這個代碼的地方。擁有課堂?創建新對象? – kajo 2011-01-15 10:56:10

1

所以最後我自己找到了解決方案。 它不是那麼幹淨,我會預料,但它的作品!

所以對於同樣的問題,未來的一代 - 我換ajaxRadio用我自己的功能:

choicesToMyForm(SHtml.ajaxRadio(...)) 

這個功能看起來像:

def choicesToMyForm(choices : ChoiceHolder[String]) : NodeSeq = 
{ 
    choices.flatMap(c => (<label>{c.xhtml} {c.key.toString}</label>)) 
}