2016-07-07 28 views
2

Wie man eine bedingte Liste der Menüeinzelteile in Clojure's Hiccup ähnlichen Datenstrukturen elegant darstellt? Meine Vorlagenfunktion endet mit Aufrufen nach into und liest nicht natürlich.Wie man Hiccup-Datenstrukturen in Clojure konditional abruft

Wunschergebnis:

[:div.menu 
    [:div.item "Home"] 
    [:div.item "Private"] 
    [:div.item "Private"] 
    [:div.item "Public"] 

Wenn ich die private Elemente in einem if setzen, ich muss noch den zurückgegebenen Vektor entrollen, oder befassen sich mit nil, so dass dies nicht funktioniert:

[:div.menu 
    [:div.item "Home"] 
    (if authenticated? 
    [[:div.item "Private"] 
    [:div.item "Private"]]) 
    [:div.item "Public"]] 

Ich fand, ich kann (into [:div.menu] ...) verwenden und in einer Liste von Elementen übergeben, aber es ist unhandlich und liest nicht natürlich. Ich endete mit diesem Ausdruck:

(-> [:div.menu 
     [:div.item "Home"]] 
    (into (if (auth/authenticated?) 
     [[:div.item "Private"] 
     [:div.item "Private"]] 
    (into [[:div.item "Public"]])) 

Gibt es einen besseren Weg?

Antwort

1

Es stellte sich heraus Hiccup Listen anders aus Vektoren behandelt, so können Sie ein() anstelle einer Rückkehr [] und haben es entrollen richtig:

[:div.menu 
    [:div.item "Home"] 
    (if authenticated? 
     (list 
     [:div.item "Private"] 
     [:div.item "Private"])) 
    [:div.item "Public"]] 
+0

Der Nachteil bei diesem Ansatz ist, dass, wenn Sie mit Reagenz oder eine reaktionsbasierte Bibliothek erhalten Sie eindeutige Schlüsselwarnungen. –