Lift/Scala最近受到了很多关注.在过去与Grails合作过(并且发现它非常方便BTW),我想知道是否有人尝试过这两种方式以及他/她对他们的看法.其中一种更适合某种情况,而另一种更适合其他类型,或者它们并肩竞争以解决同样的问题?
我有一个如下的层次结构:
case class A(val a: Long, val b: String)
case class B(val c: String) extends A(a=3, b="a string")
Run Code Online (Sandbox Code Playgroud)
我正在尝试使用lift-json序列化它以下:
val obj = B(c="another string")
val cameraJson = net.liftweb.json.Serialization.write(obj)
Run Code Online (Sandbox Code Playgroud)
但我所看到的是它只序列化了B类中的属性而不是A中的属性.
我也尝试过:
compact(render(decompose(obj)))
Run Code Online (Sandbox Code Playgroud)
结果相同
是什么赋予了?Scala中有一些我不知道的东西吗?
学习电梯我立即找到了一个不熟悉的#>操作员.究竟是什么意思?例:
/**
* Put the messages in the li elements and clear
* any elements that have the clearable class.
*/
def render = "li *" #> msgs & ClearClearable
Run Code Online (Sandbox Code Playgroud)
我可以阅读评论,知道这是什么行,但我不确定这里的代码机制.
Lift(Scala)中的编程非常紧张,它们都有非常简洁的文档,而且你能找到的少数文档是不完整和误导的.
好吧,我想要做的是在一个简单的字符串存储SessionVar.因此,一个代码段将使用表单填充此字符串的值,而在另一个代码段中,我将在会话中显示字符串(或其默认值).
到目前为止我所拥有的是:
该SessionVar对象:
// the SessionVar will contain a String with "Anonymous" as default value.
object myUser extends SessionVar[String]("Anonymous")
Run Code Online (Sandbox Code Playgroud)
我填充字符串的片段:
object Login extends LiftScreen {
val name = field("Name: ", "")
def finish() {
// set the SessionVar string with the string entered
myUser.set(name)
S.notice("Your name is: "+name)
}
}
Run Code Online (Sandbox Code Playgroud)
我在其中显示字符串的片段(另一个片段):
// show the string in SessionVar
"Your name: " + myUser.is
...
Run Code Online (Sandbox Code Playgroud)
MyUser是我在会话中保存的对象.最大的问题是:我在哪里保留我的MyUser对象?我尝试Boot.scala了两个片段,但是我一直收到这个错误:not …
我克隆了这个项目:
https://github.com/dpp/simply_lift.git
Run Code Online (Sandbox Code Playgroud)
然后我按照说明说明:
Change directories into the chat directory and type sbt update ~jetty-run.
Run Code Online (Sandbox Code Playgroud)
SBT获取依赖项,然后我得到这个:
[error] Not a valid command: jetty-run
[error] Expected '/'
[error] Expected ':'
[error] Not a valid key: jetty-run (similar: run)
[error] jetty-run
[error]
Run Code Online (Sandbox Code Playgroud)
怎么办?
我的电梯视图有问题.问题是,我正在进行两次昂贵的远程rest-api调用 - 我真的只需要做一次.
但我无法弄清楚如何解决这个问题.
基本上我有这样的HTML模板,需要显示用户列表及其计数:
//UserSearchResults.html
Num users: <span class="lift:UserSearchResults.userCount"></span>
User list:
<ul>
<lift:UserSearchResults.userList>
<li><user:userName/></li>
</lift:UserSearchResults.userList>
</ul>
Run Code Online (Sandbox Code Playgroud)
然后我有一个实际的片段,从rest-api服务器检索用户列表.但是,请注意它实际上是这两次 - 一次计算用户数,一次计算列表.
//UserSearchResults.scala
/** Get list of users from api */
def users: List[User] = {
val url = "http://server/rest-api/user-search";
val result = io.Source.fromURL(url).mkString
//... parse users into List[User] and return it
return entries
}
/** Render user count */
def userCount =
"* *" #> users.length //<-- ONE call
def userList(in: NodeSeq): NodeSeq = {
users.flatMap(user => Helpers.bind("user", in, //<--SECOND call …Run Code Online (Sandbox Code Playgroud) Lift框架似乎class="lift:something"在HTML标签中使用,但如果我想将一些普通的CSS应用于此标签并希望它具有普通的类名,该怎么办?
我有一个简单的电梯页面:
<html>
<head></head>
<body>
<span id="content" class="lift:GetContent"></span>
</body>
</html>
Run Code Online (Sandbox Code Playgroud)
和一个简单的片段:
class GetContent {
def render = "#content" #> "someValue"
}
Run Code Online (Sandbox Code Playgroud)
问题是,我怎样才能获得在URL中传递的参数(如page.html?param=value)?
我在List上有以下过滤器:
messages = messages.filterNot(m => m.room == room)
Run Code Online (Sandbox Code Playgroud)
我想要做的是有多个参数,所以我可以匹配所有具有相同房间ID和相同数据值的项目,所以类似于:
messages = messages.filterNot(m => m.room == room, m.data == data)
Run Code Online (Sandbox Code Playgroud)
这当然没有用,有没有办法可以做到这一点?
在此先感谢,任何帮助非常感谢:)