我在电梯示例中发现了这一点:
<lift:TestCond.loggedout>
<lift:embed what="/templates/_login_panel"/>
</lift:TestCond.loggedout>
如果我想测试任何其他条件,我该如何调整此提升标签?这是JSP中的某种<c:if/>
标记还是其他地方的想法?
答案 0 :(得分:2)
lift:TestCond
指的是仅提供loggedIn
和loggedOut
方法的代码段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)
。