我正在尝试在我的webapp中渲染一个单选按钮,但我遇到了一些问题。
我所做的是尝试在这个答案中发布的jcern解决方案: get checkbox and radio button value in lift
这是我的HTML代码:
<div class="lift:Radio.render">
<input id="choice" name="choice" type="radio"/>
</div>
这是我的SCALA代码:
object Radio {
def render = {
val radioChoices = List("Choice_1", "Choice_2")
var choice:Box[String] = None
"name=choice" #> SHtml.radio(radioChoices, choice, (resp) => choice = Full(resp))
}
}
但是编译器在绑定时给出了错误:
could not find implicit value for parameter computer:net.liftweb.util.CanBind[net.liftweb.http.SHtml.ChoiceHolder[String]]
[error] "@choice" #> SHtml.radio(radioChoices, choice, (resp) => choice = Full(resp))
[error] ^
我必须与.toForm
绑定才能像这样传递编译:
"name=choice" #> SHtml.radio(radioChoices, choice, (resp) => choice = Full(resp)).toForm
问题是我的网页上没有显示单选按钮,完全没有...
我做错了吗?我看不出来。为什么第一个解决方案(没有.toForm
)在编译时给我一个错误?
答案 0 :(得分:4)
原因是,SHtml.radio
和SHtml.radioElem
会返回ChoiceHolder
而不是NodeSeq
中SHtml
中的大多数其他项目的.toForm
- 正如您所看到的那样在API Doc。因此,您需要调用ChoiceHolder
或自己渲染输出。
返回toForm
可让您自定义每个项目的显示方式,因此您可以为标签添加自定义文本等...如果基本val choices = SHtml.radio(radioChoices, choice, (resp) => choice = Full(resp))
"@choice" #> choices.items.zipWithIndex.map { case(itm, pos) =>
val rId = "myId-%s".format(pos)
<div class="radio">{
//We'll add a custom ID attribute to the radio button
itm.xhtml.asInstanceOf[Elem] % ("id", rId)
}<label for={ rId }>{
//Output the toString or use some other method to output a label
itm.toString
}</label>
</div>
}
输出不适合您,你可以这样做:
CSSSelector
您可以在Lift Cookbook中找到有关自定义单选按钮的详细信息。
至于为什么你的toForm
没有输出任何东西,我不确定。您尝试的代码段为我工作。下面的屏幕截图显示了我使用{{1}}方法看到的输出。