2010-11-28 6 views
1


리프트 예에서 이것을 발견했습니다 : 리프트 : testCond - 작동 원리?

 
<lift:TestCond.loggedout> 
    <lift:embed what="/templates/_login_panel"/> 
</lift:TestCond.loggedout> 
다른 조건을 테스트하려면 어떻게해야이 리프트 태그를 조정할 수 있습니까? JSP의 <c:if/> 태그 중 일부입니까, 아니면 그 아이디어가 다른 곳입니까?

답변

2

lift:TestCondloggedInloggedOut 방법만을 제공하는 스 니펫 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에서이 일반화를 수행 할 수 없다고 생각합니다.

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

:

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에서 다음과 같이 사용할 수 있습니다 :이 나를 위해 작업을 수행하는 작은 유틸리티를 작성했습니다 사이드 참고로

+0

멋지다. 나는 다른 리프트 : 리프트와 같은 태그 : emded가 단지 미리보기에 불과하다는 사실을 깨달았습니다. – coubeatczech

0

testCond[Type](...) 또는 testCond(...)을 쓸지 여부를 결정할 수 있습니다. 두 번째 경우에는 함수의 유형을 지정해야합니다. 예 : testCond(S.param("s"), _, (_: String).nonEmpty).