리프트 예에서 이것을 발견했습니다 : 리프트 : testCond - 작동 원리?
<lift:TestCond.loggedout>
<lift:embed what="/templates/_login_panel"/>
</lift:TestCond.loggedout>
다른 조건을 테스트하려면 어떻게해야이 리프트 태그를 조정할 수 있습니까? JSP의
<c:if/>
태그 중 일부입니까, 아니면 그 아이디어가 다른 곳입니까?
리프트 예에서 이것을 발견했습니다 : 리프트 : testCond - 작동 원리?
<lift:TestCond.loggedout>
<lift:embed what="/templates/_login_panel"/>
</lift:TestCond.loggedout>
다른 조건을 테스트하려면 어떻게해야이 리프트 태그를 조정할 수 있습니까? JSP의
<c:if/>
태그 중 일부입니까, 아니면 그 아이디어가 다른 곳입니까?
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에서이 일반화를 수행 할 수 없다고 생각합니다.
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에서 다음과 같이 사용할 수 있습니다 :이 나를 위해 작업을 수행하는 작은 유틸리티를 작성했습니다 사이드 참고로
testCond[Type](...)
또는 testCond(...)
을 쓸지 여부를 결정할 수 있습니다. 두 번째 경우에는 함수의 유형을 지정해야합니다. 예 : testCond(S.param("s"), _, (_: String).nonEmpty)
.
멋지다. 나는 다른 리프트 : 리프트와 같은 태그 : emded가 단지 미리보기에 불과하다는 사실을 깨달았습니다. – coubeatczech