首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >可以从Dotliquid访问嵌套字典吗?

可以从Dotliquid访问嵌套字典吗?
EN

Stack Overflow用户
提问于 2019-11-26 02:32:10
回答 1查看 167关注 0票数 1

我想知道是否可以使用dotliquid库访问嵌套的字典。

到目前为止,我得到的是:

代码语言:javascript
运行
复制
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中做到这一点呢?任何帮助都将不胜感激。

EN

Stack Overflow用户

回答已采纳

发布于 2019-11-26 05:50:41

一个相对简单的技巧是注册一个过滤器getName,然后允许您使用{{ item | getName }}访问嵌套字典的name属性。过滤器可以编写为F#方法:

代码语言:javascript
运行
复制
type Filters() = 
  static member getName(map:Map<string, string>) = map.["name"]

Template.RegisterFilter(typeof<Filters>)

如果您现在在测试模板中使用筛选器。请注意,根据您配置的DotLiquid命名约定,您可能需要使用get_name作为名称(这也是默认名称):

代码语言:javascript
运行
复制
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) }

这样,您就得到了您所期望的结果:

代码语言:javascript
运行
复制
let genTemplate = 
    let doc = Document.Test
    let template = Template.Parse(doc.template)
    template.Render(Hash.FromDictionary(doc.elements |> Map.toSeq |> dict))

不幸的是,我不确定是否有一种方法可以创建参数化的筛选器-可能是您必须为您想要访问的每个键编写类似于getName的内容。

票数 2
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59038101

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档