如何不在Lift中迭代整个页面

时间:2011-05-17 14:25:08

标签: lift

如何在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的新手 - 所以我必须遗漏一些非常明显的东西。

3 个答案:

答案 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>

希望有道理吗?