如何在go中扩展模板?

时间:2016-11-21 06:51:59

标签: go go-templates

问题在于:每个页面上都有articlecontent部分,我想在每篇文章下方插入likebar模板。

所以base.tmpl就像:

<html>
  <head>    
    {{template "head.tmpl" .}}
  </head>
  <body>    
    {{template "content.tmpl" .}}   
   </body>
</html>

并在article.tmpl中我希望:

    {{define "content"}}    
          <div>article 1 
             {{template "likebar.tmpl" .}} 
          </div> 
          <div>article 2
             {{template "likebar.tmpl" .}} 
         </div>
       ... //these divs are generated dynamically
    {{end}}

如何使用html/template实现此目的? 我曾尝试在{{template "iconbar" .}}中插入base.tmpl,然后在{{template "likebar.tmpl" .}}内嵌套{{define "content",但失败了:

  

模板文件错误:html / template:base.tmpl:122:12:没有这样的模板   &#34; likebar.tmpl&#34;

1 个答案:

答案 0 :(得分:1)

您只能包含/插入associated templates

如果您有多个模板文件,请使用template.ParseFiles()template.ParseGlob()解析所有,结果模板将包含已关联的所有模板,以便他们可以互相引用。

如果您使用上述功能来解析模板,那么它找不到likebar.tmpl的原因是因为您使用无效名称(例如缺少文件夹名称)来引用它。 / p>

string源解析时,您可以使用Template.Parse()方法,该方法还会将嵌套模板与顶级模板相关联。

请参阅以下两个工作示例:

func main() {
    t := template.Must(template.New("").Parse(templ1))
    if err := t.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }

    t2 := template.Must(template.New("").Parse(templ2))
    template.Must(t2.Parse(templ2Like))
    if err := t2.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }
}

const templ1 = `Base template #1
And included one: {{template "likebar"}}
{{define "likebar"}}I'm likebar #1.{{end}}
`

const templ2 = `Base template #2
And included one: {{template "likebar"}}
`

const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}`

输出(在Go Playground上尝试):

Base template #1
And included one: I'm likebar #1.

Base template #2
And included one: I'm likebar #2.