【问题标题】:How to test if a Go template block is defined?如何测试是否定义了 Go 模板块?
【发布时间】:2022-08-20 01:18:12
【问题描述】:

我正在使用带有内置 HTML 模板引擎的 Go 1.19。有没有办法测试一个块是否在特定的模板文件中定义?

具体来说,我想在 Go HTML 模板中实现可选的标题条目。

我有一个通用布局模板,在呈现时包含一个内容模板。

我想实现如下...

目前,<meta name=\"description\" content=\"{{block \"description\" .}}{{end}}\"> 导致一个空的描述标签。我想根本没有标签,里面什么都没有。

有任何想法吗?

layout.gohtml(简化)[更新]

<html>
<head>
    <title>{{block \"title\" .}}The Title{{end}}</title>
    {{if .renderDescription}}
        <meta name=\"description\" content=\"{{template \"description\" .}}\">
    {{end}
</head>
<body>
    <header></header>
    {{template \"content\" .}}
    <footer></footer>
</body>
</html>

content1.gohtml

{{define \"title\"}}The 2hO Network{{end}}
{{define \"description\"}}An options description{{end}}
{{define \"content\"}}
    Vestibulum ante ipsum primis in faucibus...
{{end}}

content2.gohtml

{{define \"title\"}}The 2hO Network{{end}}
{{define \"content\"}}
    Vestibulum ante ipsum primis in faucibus...
{{end}}

    标签: go go-templates


    【解决方案1】:

    模板被设计为可静态分析的。这意味着如果您没有description 模板,则在解析模板时会出错。

    而是使用{{if}} 操作来检查是否需要呈现description 模板。 description 模板可能为空。

    例如:

    {{if .renderDescription}}
        {{template "description"}}
    {{end}}
    
    {{define "description"}}description content{{end}}
    

    如果你必须在很多地方检查.renderDescription,你也可以将检查({{if}}动作)移到模板中,这样你就可以无条件使用{{template}}(但你仍然需要提供一个包含健康)状况):

    {{template "description" .}}
    
    
    {{define "description"}}
        {{if .renderDescription}}
            description content
        {{end}}
    {{end}}
    

    笔记:

    {{block}} 动作不是包含模板,而是定义包括一个模板。要包含在别处定义的模板,请使用{{template}}

    您还必须更改模板结构。不要让“框架”模板嵌入“内容”,而是定义“页眉”和“页脚”模板,并让每个页面都有自己的模板,包括“页眉”、内容和“页脚”。

    【讨论】:

    • 谢谢。但是,我认为你误解了这个问题......我有一个可能会或可能不会在嵌套模板中定义的块。定义后,我希望将块包装在标签中。当它没有定义时,我希望跳过标签,避免空标签......
    • 至于包装内容的布局模板,它工作正常。您只需在代码中手动解析它们并将结果存储在切片中。即您不能依赖模板名称,因为它们都将被称为“布局”。
    • @PrecisionPete 我明白你的问题。但是同样,当您解析模板时,如果缺少模板,{{template}} 操作将导致解析失败(返回错误)。你使用了{{block}},这就是它没有为你失败的原因。 {{block}}不是包含在别处定义的模板,就是定义一个模板执行到位。它是{{define}} 的缩写,后跟{{template}} 操作。
    • 您能解释一下.renderDescription 的来源吗?我似乎无法让它发挥作用。如果可以的话,它会很好地解决问题。在我的,它只是空白。不真不假。例如&lt;{{.renderDescription}}&gt; 呈现为 &lt;&gt;
    猜你喜欢
    • 1970-01-01
    • 2011-01-03
    • 1970-01-01
    • 2010-09-11
    • 2017-02-11
    • 2012-10-07
    • 2019-08-03
    • 2014-01-09
    • 1970-01-01
    相关资源
    最近更新 更多