2

我正在尝试在我的 web 应用程序中呈现单选按钮选项,但我遇到了一些问题。

我所做的是尝试在此答案中发布的 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)在编译时给我一个错误?

4

1 回答 1

4

原因是SHtml.radioSHtml.radioElem返回 aChoiceHolder而不是NodeSeq大多数其他项目SHtml所做的 - 正如您在API Doc中看到的那样。因此,您需要自己调用.toForm或渲染输出。

返回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>
}

您可以在Lift Cookbook中找到有关自定义单选按钮的更多信息。

至于为什么你CSSSelector没有输出任何东西,我不确定。您尝试的代码片段对我有用。下面的屏幕截图说明了我使用该toForm方法看到的输出。

输出截图

于 2013-07-30T14:56:47.370 回答