Scala - Lift - 为绑定映射自定义盒装对象?

时间:2011-06-17 21:55:30

标签: scala lift

好的,所以我有一个自定义对象是myUser。

myUser看起来像这样:

username:String = ""
firstname:String = ""
lastname:String = ""

我有一个进入页面的这些用户列表,我已经建立了一个链接来查看每个用户的详细信息。当您单击某个用户时,它将填充我作为请求var的盒装对象,然后直接转到详细信息页面以查看此用户信息。为什么我不能从这个对象的地图绑定?这是一些代码...

private object selectedUser extends RequestVar[Box[myUser]](Empty)

def getusers(html: NodeSeq):NodeSeq = {

    //This gets me a list of 10 users that are "myUser" objects
    val userList = User.getUsers(10)

    userList.flatMap{user => bind("user", html,
        "username" -> SHtml.link("/%2Fadmin%2Fdetail", () => selectedUser(Full(user)), Text(user.username)),
        "firstname" -> {user.firstname},
        "lastname" -> {user.lastname},
        "lastloggedin" -> {user.lastloggedin})}
}

现在当我到达用户详细信息页面时,我想要映射出我写过的selectedUser对象....但由于某种原因,我无法让它工作,它给了我这个错误:< / p>

  

类型不匹配;发现:   net.liftweb.common.Box [scala.xml.NodeSeq]   required:scala.xml.NodeSeq

以下是给我这个错误的代码:

def userdetail(html: NodeSeq):NodeSeq = {
    selectedUser.is.map{user => bind("user", html, 
        "username" -> {user.username},
        "firstname" -> {user.firstname},
        "lastname" -> {user.lastname},
        "lastloggedin" -> {user.lastloggedin})}
}

有趣的是,我可以这样做,它会起作用,但必须有一种方法可以在一行上做到这一点吗?

这有效......但它很麻烦:

def userdetail(html: NodeSeq):NodeSeq = {

    var username = ""
    var firstname = ""
    var lastname = ""
    var lastloggedin = ""

    bind("user", html, 
        "username" -> {username},
        "firstname" -> {firstname},
        "lastname" -> {lastname},
        "lastloggedin" -> {lastloggedin})
}

有人可以告诉我我在这里失踪的小事吗?我希望我能够清楚地解释自己。

谢谢!

1 个答案:

答案 0 :(得分:2)

如果没有selectedUser,则会给你一个空的NodeSeq,否则会给你一个结果。

def userdetail(html: NodeSeq):NodeSeq = {
    selectedUser.is.toList.flatMap{user => bind("user", html, 
        "username" -> {user.username},
        "firstname" -> {user.firstname},
        "lastname" -> {user.lastname},
        "lastloggedin" -> {user.lastloggedin})}
}