问题在于:每个页面上都有article
个content
部分,我想在每篇文章下方插入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;
答案 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.