Действительно запутался насчет фрагментов - PullRequest
2 голосов
/ 28 июня 2011

У меня проблема с видом на лифт.Дело в том, что я делаю дорогой удаленный вызов 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>

А затем у меня есть реальный фрагмент кода, который отправляет список пользователей из остальных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 ]

5 голосов
/ 28 июня 2011

Если UserSearchResults является классом (в отличие от объекта), то будет экземпляр этого класса для каждого запроса.Таким образом, все, что вам нужно сделать, это изменить пользователей def на lazy val users, и вы должны быть в порядке.

0 голосов
/ 28 июня 2011

Если ваш фрагмент расширяет StatefulSnippet, вы можете просто сохранить список в переменной экземпляра.Другой вариант - поместить список в RequestVar.Тогда к нему также можно получить доступ из других фрагментов.

...