如何在Lift中绑定一些变量,以便我可以在模板的“迭代”部分之外使用它们。
这对我来说非常困惑,所以我会在一个例子的帮助下提出这个问题。
假设我有一些代码段方法可以提供用户列表,以及这些用户的总数:
def users(in: NodeSeq) :NodeSeq={
val (entries:List[User], total:Int) = // read entries and total from somewhere
// expensive operation
entries.flatMap(user => Helpers.bind("patient", in,
"userID" -> user.userID,
"userName" -> user.userName))
现在我想在模板中使用它:
...
<lift:Search.users>
<tr>
<td><user:userID/></td>
<td><user:userName/></td>
</tr>
</lift:Search.users>
...
但是,我还希望输出总的用户数 - 但页面上的其他位置:
<b>Total users: <user:total></b> <--- ?????
...
<lift:Search.users>
<tr>
<td><user:userID/></td>
<td><user:userName/></td>
</tr>
</lift:Search.users>
...
您可以想象这不起作用,因为它位于搜索片段标记之外。此外 - 如果我尝试绑定总计用户 - 它会取消我之前为用户绑定的所有绑定!
我尝试将电梯标签放在整个文档周围,但这只会使整个页面重复!!
<body>
<lift:Search.users> <---- clones the whole page!
<b>Total users: <user:total></b>
<table>
...
<tr>
<td><user:userID/></td>
<td><user:userName/></td>
</tr>
</table>
</lift:Search.users>
</body>
我是Lift的新手 - 所以我必须遗漏一些非常明显的东西。
答案 0 :(得分:1)
我不能说它是最佳还是工作解决方案,但您可以尝试使用RequestVar:http://simply.liftweb.net/index-4.4.html#toc-Section-4.4。 您可以计算用户的列表和计数,并将数据保存到RequestVar中,该值将在当前请求的另一个片段中提供。
答案 1 :(得分:0)
我认为最简单的方法是使用一个单独的片段方法,使用自己的绑定定义将它与迭代绑定分开。但我对此有点新意,所以可能有一种更简单的方法。
您可能还想了解更新的设计师友好风格,以定义您的代码段。我不认为它会让这更容易,但总体上可能更好。 Simply Lift在这里概述了这种方法:http://simply.liftweb.net/index-3.4.html#toc-Section-3.4
答案 2 :(得分:0)
我只是将用户计数变量读入另一个函数,并从那里输出....
//Scala Code
private val users = List("kevin", "drozzy", "kyle")
def userList(html : NodeSeq) : NodeSeq = {
users.flatMap(user => bind("user", html, "name" -> user))
}
def userCount = "#count *" #> {users.length}
//HTML Code
<b>Total users:
<lift:SearchUsers.userCount>
<div id="count"/>
</lift:SearchUsers.userCount>
</b>
<table>
<lift:SearchUsers.userList>
<tr>
<td><user:name/></td>
</tr>
</lift:SearchUsers.userList>
</table>
希望有道理吗?