电梯中的单选按钮?

时间:2013-07-30 14:21:22

标签: scala radio-button lift

我正在尝试在我的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)在编译时给我一个错误?

1 个答案:

答案 0 :(得分:4)

原因是,SHtml.radioSHtml.radioElem会返回ChoiceHolder而不是NodeSeqSHtml中的大多数其他项目的.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}}方法看到的输出。

Screen shot of output