关于片段真的很困惑

时间:2011-06-28 15:12:25

标签: scala lift

我的电梯视图有问题。问题是,我正在进行两次昂贵的远程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>

然后我有一个实际的片段,从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
      "userName" -> user.user_name)) 
  }

有没有更好的地方拨打api电话?有没有像片段的“构造函数”,我可以使用缓存用户列表,并在类中的所有函数之间共享它?

感谢任何帮助。

2 个答案:

答案 0 :(得分:5)

如果UserSearchResults是一个类(而不是一个对象),那么将会有该类的每个请求实例。因此,您所要做的就是将您的def用户更改为懒惰的val用户,您应该好好去。

答案 1 :(得分:0)

如果您的代码段扩展了StatefulSnippet,则只需将列表保存在实例变量中即可。另一种选择是将列表放入RequestVar。然后它也可以从其他片段访问。

相关问题