2010-11-28 70 views
1


我在升降機示例中發現了這個:電梯: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" /> 

或類似的東西。但這真的取決於你的用例,所以我認爲在Lift中不可能這樣做。

+0

很酷,我剛剛意識到,即使是其他的電梯:標籤像電梯:emded只是片段,沒有像以前的想法神奇 – coubeatczech 2010-11-28 15:37:31

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)