我想知道是否可以使用dotliquid库访问嵌套的字典。
到目前为止,我得到的是:
type Document = {
template : string
elements : Map<string, obj>
}with
static member Test = {
template = "{% for item in test %} {{ item[\"name\"] }} {% endfor %}"
elements =
Map.empty
|> Map.add "test" ([Map.empty |> Map.add "name" "Foo"] :> obj)
}
let genTemplate =
let doc = Document.Test
let template = Template.Parse(doc.template)
template.Render(Hash.FromDictionary(doc.elements |> Map.toSeq |> dict))预期的结果是:Foo,但不出所料,我只是得到了一个空字符串。如果我只是访问item,而不是item["name"],我会得到输出的["name", "Foo"]。那么有没有办法在dotliquid中做到这一点呢?任何帮助都将不胜感激。
发布于 2019-11-26 05:50:41
一个相对简单的技巧是注册一个过滤器getName,然后允许您使用{{ item | getName }}访问嵌套字典的name属性。过滤器可以编写为F#方法:
type Filters() =
static member getName(map:Map<string, string>) = map.["name"]
Template.RegisterFilter(typeof<Filters>)如果您现在在测试模板中使用筛选器。请注意,根据您配置的DotLiquid命名约定,您可能需要使用get_name作为名称(这也是默认名称):
type Document =
{ template : string
elements : Map<string, obj> }
static member Test =
{ template = "{% for item in test %} {{ item | get_name }} {% endfor %}"
elements =
Map.empty
|> Map.add "test" ([Map.empty |> Map.add "name" "Foo"] :> obj) }这样,您就得到了您所期望的结果:
let genTemplate =
let doc = Document.Test
let template = Template.Parse(doc.template)
template.Render(Hash.FromDictionary(doc.elements |> Map.toSeq |> dict))不幸的是,我不确定是否有一种方法可以创建参数化的筛选器-可能是您必须为您想要访问的每个键编写类似于getName的内容。
https://stackoverflow.com/questions/59038101
复制相似问题