我在升降機示例中發現了這個:電梯: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
方法。 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 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)
。
很酷,我剛剛意識到,即使是其他的電梯:標籤像電梯:emded只是片段,沒有像以前的想法神奇 – coubeatczech 2010-11-28 15:37:31