在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
是解决此问题的方法。只是想知道我是否可以使用帖子解决它并重新加载......