如何在电梯中实施搜索表单,在同一页面上显示结果,并记住输入?

时间:2014-09-25 02:29:20

标签: scala lift

在Lift中,我正在尝试创建一个功能,用户可以输入订单号并在与表单相同的页面上返回结果,并让表单记住输入。这是HTML:

<form data-lift="ordersearchform?form=post">
    Order Number: <input name="ordernumber"><br>
  <input type="submit" value="Search">
  <table>
    <tr>
      <th id="tableheaderentries"></th>
    </tr>
    <tr><td id="myrowsoftabledata"></td>
    </tr>
  </table>
</form>
<div class="lift:Msgs?showAll=true"></div>

以下是我对scala代码的尝试:

import scala.xml.{ NodeSeq, Text }
import net.liftweb.util._
import net.liftweb.common._
import java.util.Date
import code.lib._
import Helpers._
import net.liftweb.util.Helpers._
import net.liftweb.http.S
import net.liftweb.http.SHtml
import net.liftweb.http.StatefulSnippet

import _root_.net.liftweb.mapper._
import code.model._

class ordersearchform extends StatefulSnippet {

  private var ordernumber: String = ""
  private val whence = S.referer openOr "/"

  def dispatch: DispatchIt = { case "render" => render _ }

  def render(xhtml : NodeSeq) : NodeSeq = {

    "@ordernumber" #> SHtml.text(ordernumber, ordernumber = _) &
    "type=submit" #> SHtml.onSubmitUnit(process)

  }

  def process() {
      val fieldNames: List[String] = List("Order Number", "Buyer", "Supplier")
      val fieldValues = Order.findAll(Like(Order.ordernumber, s"%$ordernumber%"))

      println(fieldNames)
      "#tableheaderentries *" #> fieldNames
      "#myrowsoftabledata *" #> fieldValues.map(values => "td *" #> values) 

    // }
  }

}

我的基础是:

The StatefulSnippet API,我从中收集渲染必须是将NodeSeq转换为NodeSeq的函数; Lift in Action source code,我发现回想起来可能不适用; Exploring Lift sample code,这是我上面提交表单的基础,但不做任何CSS选择器转换(这是我需要做的); More Exploring Lift sample code,这也表明我可能会尝试使渲染函数将NodeSeq转换为Nodeq,但我无法弄清楚如何使用这种方法解决这个特定问题。我也在使用Simply Lift, chapter 14的食谱。我希望this SO Question would help,因为它是直接相关的,但是接受的答案(由作者发布)没有帮助,因为它没有包含代码段。

上面的scala代码无法编译;我收到以下错误:

[error]  found   : net.liftweb.util.CssSel
[error]  required: scala.xml.NodeSeq
[error]     "@ordernumber" #> SHtml.text(ordernumber, ordernumber = _) &
[error]                                                       ^
[error] one error found 

我是否需要使用绑定功能和模板?我不应该将NodeSeq用于NodeSeq吗?我想扩展StatefulSnippet并处理表单,但如果采用这种方法,我无法弄清楚如何进行CSS Selector Transform来呈现数据。

有关电梯谷歌小组here的问题,但问题并未解决。任何人都可以建议吗?

更新2014年9月27日:我正在尝试@jcern对此帖发表评论的建议。当我将def render(xhtml : NodeSeq)更改为def render:NodeSeq=>NodeSeq = {

我收到以下错误:

[error]  found   : () => scala.xml.NodeSeq => scala.xml.NodeSeq
[error]  required: scala.xml.NodeSeq => scala.xml.NodeSeq
[error]   def dispatch: DispatchIt = { case "render" => render _ }
[error]                                                 ^
[error] one error found
[error] (compile:compile) Compilation failed

当我完全删除类型签名(即更改为def render = {)时,在尝试编译时出现以下错误:

[error]  found   : () => net.liftweb.util.CssSel
[error]  required: scala.xml.NodeSeq => scala.xml.NodeSeq
[error]   def dispatch: DispatchIt = { case "render" => render _ }
[error]                                                 ^
[error] one error found
[error] (compile:compile) Compilation failed

我认为使用Memoize是解决此问题的方法。只是想知道我是否可以使用帖子解决它并重新加载......

0 个答案:

没有答案