覆盖提升ajaxRadio toForm默认标记

时间:2011-01-14 19:24:14

标签: scala lift

我的表单中有ajaxRadio,但是Lift为我生成了不需要的标记(它用span填充输入标记,我想标记标记)。 可以覆盖默认的toForm函数或完全覆盖方法htmlize,这称为

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

那么如何获得,输入标签周围将是标签而不是跨度?

非常感谢。

2 个答案:

答案 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>) )
}