Text.Blaze有一个运营商!添加属性到html:
option ! id "bla" ! value "1" ! selected "" $ "Hello!"
我的问题是如何让属性可选? 现在我的代码很难看:
option ! id "bla" ! value "1" ! (if x == val then selected "" else someStupidAttribute "") $ "Hello!"
这导致每个html选项元素都有不必要的无关属性,因为我必须提供一个。
编辑:我接受了hammar的回答。我创建了一个辅助函数:(!?) :: Attributable h => h -> (Bool,Attribute) -> h
html !? (True, attr) = html ! attr
html !? _ = html
以下是如何使用它:
option ! id "bla" ! value "1" !? ((k == val), selected "") $ "Hello!"
答案 0 :(得分:5)
如何定义便利运算符以有条件地应用属性?
(!?) :: Attributable h => h -> Maybe Attribute -> h
html !? (Just attr) = html ! attr
html !? Nothing = html
有了这个,您可以按如下方式编写示例。
option ! id "bla" ! value "1" !? toMaybe (x == val) (selected "") $ "Hello!"
在这里,toMaybe
只是构建Maybe
值的有用助手,但如果您愿意,可以使用其他内容。
toMaybe :: Bool -> a -> Maybe a
toMaybe False _ = Nothing
toMaybe True x = Just x
答案 1 :(得分:2)
我最喜欢的条件是使用列表推导; [foo | x]
会评估为[foo]
或[]
。我们能适应这个伎俩吗好吧,使用一个应用属性列表的辅助函数:
element !. options = foldr (!) element options -- (!.) = foldr (!)
现在你可以写一些相对非常像这两个中的一个(取决于品味):
option ! id "bla" ! value "1" !. [selected "" | x == val] $ "Hello!"
option !. [id "bla", value "1"] ++ [selected "" | x == val] $ "Hello!"
您可能需要为!.
添加固定声明;您可以在ghci中使用:i !
来查看您要与之互操作的内容。
答案 2 :(得分:0)
我不知道是否有更好的Blaze特定的方式来做这个,我知道这不是非常可读,但你可以做到
(if x == val then (! selected "") else id) (option ! id "bla" ! value "1") $ "Hello!"
答案 3 :(得分:0)
这似乎对我有用 - mempty:
import Data.Monoid (mempty)
option ! id "bla" ! value "1" ! (if x == val then selected "" else mempty) $ "Hello!"