Clojure Hiccup中的条件句,我能让它更地道吗?
克洛朱尔初学者在这里!我在一个Noir项目中为我的Hiccup代码添加了flash消息支持 我要做的是检查是否设置了每个特定的消息字符串。如果没有消息,那么我不想显示包含该消息的特定flash元素Clojure Hiccup中的条件句,我能让它更地道吗?,clojure,noir,hiccup,Clojure,Noir,Hiccup,克洛朱尔初学者在这里!我在一个Noir项目中为我的Hiccup代码添加了flash消息支持 我要做的是检查是否设置了每个特定的消息字符串。如果没有消息,那么我不想显示包含该消息的特定flash元素 (defpartial success-flash [msg] [:div.alert.notice.alert-success [:a.close {:data-dismiss "alert"} "x"] [:div#fla
(defpartial success-flash [msg]
[:div.alert.notice.alert-success
[:a.close {:data-dismiss "alert"} "x"]
[:div#flash_notice msg]])
(defpartial error-flash [msg]
[:div.alert.notice.alert-error
[:a.close {:data-dismiss "alert"} "x"]
[:div#flash_notice msg]])
[..]
(defpartial layout [& content]
(html5
[:head
[...]
[:body
(list
[...]
[:div.container
(let [error-msg (session/flash-get :error-message)
error-div (if (nil? error-msg) () (error-flash error-msg))
success-msg (session/flash-get :success-message)
success-div (if (nil? success-msg) () (success-flash success-msg))]
warning-msg (session/flash-get :warning-message)
warning-div (if (nil? warning-msg) () (warning-flash warning-msg))]
(list error-div success-div warning-div content))])]))
免责声明:我完全同意,您不太可能需要同时打开多个特定闪光灯,但请允许我尝试找出一种更好、更实用的实现方法
我相信有一种模式可以处理类似的情况。基本上我检查几个表达式的值,用这些值做一些事情,然后根据结果采取行动。你可以用一个越来越可怕的(cond)来解决这个问题,但我的解决方案至少更干净一些
提示?该模式称为映射值。下面是一个使用
keep
函数应用映射值模式并对其进行过滤的示例
(use 'clojure.contrib.core)
(def flash-message
[[:error-message error-flash]
[:success-message success-flash]
[:warning-message warning-flash]])
(keep (fn [m f] (-?>> m (session/flash-get) (f))) flash-message)
您也可以在let时使用
(defpartial layout
[& contents]
(html5
[:body
(when-let [msg (session/flash-get :error-message)]
(error-flash msg))
(when-let [msg (session/flash-get :warning-message)]
(warning-flash msg))
(when-let [msg (session/flash-get :success-message)]
(success-flash msg))
contents))
我不是打嗝专家,但我认为这应该行得通。我发现它更清楚地描述了正在发生的事情,尽管它有点冗长。我非常喜欢这一个,非常清晰而且切中要害!我有时会忘记你在处理hiccup中的向量,所以你可以用这种方式组合所有你想要的表达式。