2010-11-28 20 views
1


リフトの例でこれが見つかりました:lift:testCond - それはどのように動作しますか?

 
<lift:TestCond.loggedout> 
    <lift:embed what="/templates/_login_panel"/> 
</lift:TestCond.loggedout> 
他の条件をテストするにはどうすればこのリフトタグを調整できますか?これは、JSPで <c:if/>タグのいくつかの種類ですか、それとも別のアイデアですか?

答えて

2

lift:TestCondは、loggedInloggedOutの方法しか提供しないスニペット​​を参照しています。コードとマークアップの境界がぼやけるため、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" /> 
することができます異なる動作を実装することができ

または同様のもの。しかし、これは実際にあなたのユースケースに依存するので、私はそれがリフトでこれを一般化することはできないと思う。

+0

cool、私はちょうど他のリフト:エレベーターのようなタグがemippedであることを認識したことがあります。 – coubeatczech

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)

関連する問題