Лифт: TestCond - как это работает? - PullRequest
1 голос
/ 28 ноября 2010


я обнаружил это в примерах лифта: <lift:TestCond.loggedout> <lift:embed what="/templates/_login_panel"/> </lift:TestCond.loggedout> Как настроить этот лифт-тег, если я хочу проверить любое другое условие? Это какой-то тег <c:if/> в JSP или идея в другом месте?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

lift:TestCond относится к фрагменту object TestCond, который предоставляет только методы loggedIn и loggedOut. В Lift нет общего <c:if/>, потому что оно стирает границы между кодом и разметкой.

Если вам нужно другое поведение, вам нужно самостоятельно реализовать такие тесты и сделать их явными в своем коде. Но это действительно просто. Глядя на исходный код, вы можете получить представление о том, как настроить его в соответствии с вашими потребностями.

Код для loggedIn так же просто, как

def loggedIn(xhtml: NodeSeq): NodeSeq =  
  if (S.loggedIn_?) xhtml else NodeSeq.Empty  

Так, например, вы можете реализовать другое поведение, которое учитывает

<lift:HasRole.administrator />

или более продвинутый

<lift:HasRole.any type="administrator manager" />

или что-то подобное. Но это действительно зависит от вашего варианта использования, поэтому я думаю, что сделать это универсальным в Lift невозможно.

0 голосов
/ 02 марта 2011

В качестве примечания я написал небольшую утилиту, которая выполняет эту задачу для меня:

object SnippetUtil {
  def testCond[T](value: Box[T], in: NodeSeq, f: T => Boolean): NodeSeq =
    value match {
      case Full(v) if f(v) => in
      case _ => NodeSeq.Empty
    }
}

Затем вы можете использовать ее, например, в DispatchSnippet, например:

Вы можете решить, хотите ли вы написать testCond[Type](...) или testCond(...).Во втором случае вам нужно будет указать тип функции.Например, testCond(S.param("s"), _, (_: String).nonEmpty).

...