Есть ли у liftweb итерационные теги? - PullRequest
1 голос
/ 29 ноября 2010

Мне было интересно, есть ли в Lift итерационный тег (например, for, foreach)? Когда я работал с JSP, я мог легко перебирать List, просто с JSP, передавая объект в тег. Что-то вроде это или как это . Я знаю, что это не самый лучший пример, но вы понимаете мои намерения. Подводя итог, существует ли это с Lift, или, если нет, как мне удастся это сделать?

Последнее, что я хочу сделать, - это жесткий код html.

1 Ответ

10 голосов
/ 29 ноября 2010

Вкратце: Нет. Дизайн Lift строго отделяет логику от дизайна и поэтому запрещает использование обобщенных тегов в разметке шаблона.

Ознакомьтесь с первой статьей view inЧтобы увидеть, как лифт может обрабатывать итерации.

Пример из статьи: Ваша разметка:

<table>
  <lift:show.users>
    <tr>
      <td><f:first_name>David</f:first_name></td>
      <td><f:last_name>Pollak</f:last_name></td>
    </tr>
  </lift:show.users>
</table>

Ваш код:

class Show {
  def users(xhtml: NodeSeq): NodeSeq = 
    Users.findAll.flatMap(user => 
      bind("f", xhtml, 
        "first_name" -> user.firstName, 
        "last_name" -> user.nameName
      )
    )
}

Теперь, что делает лифткогда он видит тег, <lift:show.users> вызывает соответствующий метод с содержимым тега в качестве аргумента.Затем тег будет заменен возвращаемым значением метода users.

Метод users выполняет итерацию по всем Users, и для каждого пользователя он bind s определяет значения первогои второе имя для внутреннего xhtml.Все эти итерации затем объединяются (через flatMap) и возвращаются.

Когда я начинал с лифта, я всегда считал этот подход слишком жестким;Крошечная петля здесь и там, как это может повредить?Но теперь, когда я знаю, как просто вызывать и для создания своих собственных фрагментов из кода шаблона, я не могу больше использовать что-то вроде jsp.Это слабое сравнение и загромождает вашу разметку.И, конечно, вы теряете большую часть силы проверки Scala.

Примечания:

Причина, по которой теги шаблонов заполнены содержимым, предназначена для целей проектирования.В этом случае фиктивные теги и значения будут заменены во время bind.Таким образом, разработчики шаблонов могут заполнять теги более или менее значимым содержимым, что позволяет кодировщику лучше понимать семантику, которую имел в виду дизайнер.

...