我的表单中有ajaxRadio,但是Lift为我生成了不需要的标记(它用span填充输入标记,我想标记标记)。 可以覆盖默认的toForm函数或完全覆盖方法htmlize,这称为
object ChoiceHolder {
var htmlize: ChoiceItem[_] => NodeSeq = c => (<span>{c.xhtml} {c.key.toString}<br/> </span>)
}
那么如何获得,输入标签周围将是标签而不是跨度?
非常感谢。
答案 0 :(得分: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
属性。然后将调用匿名函数来接收此ID,以便您可以在标签的for
属性中使用它。
修改强>
请注意,ChoiceHolder.htmlize
是一种全局函数,将通过所有ChoiceHolder.toForm
调用进行调用。因此,如果您希望在任何地方都使用相同的布局,那么全局更改它是有意义的。
如果您只想在一个案例中使用不同的布局,那么最好只调用一些choiceToForm
方法。
答案 1 :(得分:1)
所以最后我自己找到了解决方案。 这不是我想象的那么干净,但它确实有效!
因此对于具有相同问题的下一代 - 我用自己的函数包装ajaxRadio:
choicesToMyForm( SHtml.ajaxRadio( ... ) )
,此功能如下:
def choicesToMyForm(choices : ChoiceHolder[String]) : NodeSeq =
{
choices.flatMap( c => (<label>{c.xhtml} {c.key.toString}</label>) )
}