我开始使用Lift并阅读了一些在线提供的教程和书籍。来自JSP(或GWT)背景,这是一个巨大的飞跃,特别是因为我还在学习Scala。
无论如何......我通过从他们的网站下载电梯tar.gz的东西创建了基本网站,复制了lift_blank“目录并将其重命名为”test“。整个”sbt update~prayty-run“东西等等。
我想要做的是修改“index.html”页面,只需输入一个文本字段,然后按一下“搜索”按钮。基本思路,你输入你的名字,点击“搜索”,执行数据库查询,找到名字为“你输入的文本字段”的记录,然后结果被格式化并显示在网页;页面刷新后,文本字段也需要包含输入的名称。您键入不同的名称,点击“搜索”,页面上会显示新的结果。最初(第一次访问该页面),结果当然是空的。简单的东西......
然而,我所见过的例子都使用html表单和POST backs等;我真的不喜欢这个,例如用户在刷新页面时会感到慌乱并且他们得到一个firefox弹出窗口“为了显示这个页面,Iceweasel必须发送信息,这些信息将重复之前执行的任何操作(例如搜索或订单确认)。 “...页面也刷新了,这是我想避免的。
以前当我在JSP中构建它时,我会使用所有的javascript;没有“形式”标签或任何东西,只是一个带有javascript事件的简单字段,用于点击输入或点击“按钮”...事件被引导到主要的javascript函数“onQuery”,然后创建一个AJAX请求;当结果从服务器返回时,javascript会通过更改“innerHTML”值来修改包装器“div”元素。这里的好处是页面不刷新,只是它的一小部分,“表“(实际上是一个div)保存结果。
我如何在Lift中重新创建一个非常相似的东西?我有点迷失在这里。我在过去的几天里跟随了几个例子,但他们都使用了POST /表格。我可以处理scala数据库查询,我理解Lift的模板是如何工作的,它只是我可以使用几个指针的片段/彗星的东西。
答案 0 :(得分:2)
您可以尝试使用SHtml.ajaxText函数获取输入并使用服务器端的Wiring来处理请求并自动更改结果。
但是,使用此解决方案,您不再需要提交按钮,但由于您不需要表单,因此它不应该太重要。
以下是我对HTML文件的看法:
<div id="myHtml" class="lift:surround?with=default;at=content">
<form class="lift:form.ajax">
<input class="lift:SearchForm.name"/>
</form>
Value searched : <span class="lift:SearchForm.display">
</div>
现在在服务器端,它有点复杂
class SearchForm{
val name = SHtml.ajaxText("", s=>{ SearchWiring.name.set(s); Noop})
def display = {
WiringUI.apply(SearchWiring.name)(name:String => {"*" #> name} )
}
}
object SearchWiring{
val name = ValueCell("All")
}
我不知道这是否完全严格,但我最好的想法是你的问题。您可以在the official liftweb demo和Seven Things blog上找到有关接线的更多详细信息。我希望它会有所帮助!
答案 1 :(得分:0)
以下是我最终使用的内容。我不喜欢Lift的一件事是需要在各个点插入的所有“魔法”。我可以理解大部分内容,但整个“++隐藏”的东西可以使用一些解释......
“index.html”页面,包括“body”标签在内的所有内容:
<body class="lift:content_id=main">
<div id="main" class="lift:surround?with=default;at=page">
<lift:Search.search>
Search Query: <query:text/> <query:button/><br/>
<div id="results">
</div>
</lift:Search.search>
</div>
</body>
“Snippet”代码,在一个名为“Search.scala”的类中(某些import语句未使用,是尝试不同方法的剩余结果):
package code
package snippet
import scala.xml.{NodeSeq, Text}
import net.liftweb.util._
import net.liftweb.common._
import java.util.Date
import code.lib._
import Helpers._
import common.Main
import common.solr.{Hitlist, Solr}
import net.liftweb.http.{S, StatefulSnippet, SHtml}
import net.liftweb.http.js.JsCmds.SetHtml
import _root_.net.liftweb.http.SHtml._
import _root_.net.liftweb.util.Log
import net.liftweb.http.js.JsCmd
import net.liftweb.http.js.JE.JsRaw
object Search {
def search(xhtml:NodeSeq):NodeSeq = {
var queryText = "(initial)"
def runQuery() = {
println("\n\nQuery: " + queryText)
SetHtml("results", <span>Query: {queryText}</span>)
}//runQuery
ajaxForm(
bind("query", xhtml,
"text" -> text(queryText, queryText = _),
"button" -> submit("Post", runQuery)
) ++ hidden(runQuery _)
)
}//search
}//Search