2010-11-28 8 views
1


Ich entdeckte dies in Lift-Beispielen: Aufzug: testCond - wie es funktioniert?

 
<lift:TestCond.loggedout> 
    <lift:embed what="/templates/_login_panel"/> 
</lift:TestCond.loggedout> 
Wie zwicke ich diese Lift-Tag, wenn ich eine andere Bedingung testen möchte? Ist das eine Art von <c:if/> Tag in JSP oder die Idee ist woanders?

Antwort

2

lift:TestCond bezieht sich auf das Codefragment object TestCond, das nur die Methoden loggedIn und loggedOut bereitstellt. Es gibt kein allgemeines <c:if/> in Lift, da es die Grenzen zwischen Code und Markup verwischen würde.

Wenn Sie ein anderes Verhalten wünschen, müssen Sie solche Tests selbst implementieren und in Ihrem Code explizit machen. Aber es ist wirklich einfach. Wenn Sie sich den Quellcode ansehen, können Sie sich ein Bild darüber machen, wie Sie dies an Ihre Bedürfnisse anpassen können.

Der Code für loggedIn so einfach wie

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

So zum Beispiel könnten Sie ein anderes Verhalten implementieren, die

<lift:HasRole.administrator /> 

oder fortgeschrittenere

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

erlaubt

oder etwas Ähnliches. Aber das hängt wirklich von deinem Anwendungsfall ab, also denke ich, dass es nicht möglich ist, dies in Lift generisch zu machen.

+0

cool, ich habe gerade festgestellt, dass sogar andere lift: tags wie lift: emded sind nur schnipsel, nichts magisch wie ein gedanke vorher – coubeatczech

0

Als Randbemerkung ich ein kleines Programm geschrieben haben, die für mich, diese Aufgabe erfüllt:

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 
    } 
} 

Dann können Sie es wie folgt aus in einem DispatchSnippet zum Beispiel verwenden:

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

Sie können entscheiden, ob Sie testCond[Type](...) oder testCond(...) schreiben möchten oder nicht. Im zweiten Fall müssen Sie den Typ der Funktion angeben. Z.B. testCond(S.param("s"), _, (_: String).nonEmpty).