电梯:testCond - 它是如何工作的?

时间:2010-11-28 14:29:56

标签: scala lift


我在电梯示例中发现了这一点:

<lift:TestCond.loggedout>
  <lift:embed what="/templates/_login_panel"/>
</lift:TestCond.loggedout>
如果我想测试任何其他条件,我该如何调整此提升标签?这是JSP中的某种<c:if/>标记还是其他地方的想法?

2 个答案:

答案 0 :(得分:2)

lift:TestCond指的是仅提供loggedInloggedOut方法的代码段object TestCond。 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中使这个通用。

答案 1 :(得分:0)

作为旁注,我写了一个小工具,为我执行这项任务:

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中使用它,例如:

object SearchSnippet extends DispatchSnippet {
  def dispatch = {
    case "hasParameter" => testCond[String](S.param("s"), _, _.nonEmpty)
    // ...
  }
}

您可以决定是否要撰写testCond[Type](...)testCond(...)。在第二种情况下,您必须指定函数的类型。例如。 testCond(S.param("s"), _, (_: String).nonEmpty)