我有一个布局模板(base.tmpl
),我想在登录页面(login.tmpl
),主要内容页面(main.tmpl
)等使用几次。base.tmpl
文件:
{{define "base"}}
<html>
<head>
{{block "header" .}}
<title>Untitled</title>
{{end}}
</head>
<body>
<div id="main-content">
{{block "content" .}} {{end}}
</div>
{{block "footer" .}} {{ end}}
</body>
</html>
{{end}}
这些页具有使用base
布局的第一指令,并且它们可以定义header
、content
和footer
块。login.tmpl
文件:
{{template "base"}}
{{define "header"}}
<title>Login</title>
<link rel="stylesheet" href="styles.css">
{{end}}
{{define "content" }}
<input type="username">
<input type="submit" value="Login">
{{end}}
main.tmpl
文件:
{{template "base"}}
{{define "header"}}
<title>Main content</title>
{{end}}
{{define "content" }}
<h1>Welcome</h1>
{{end}}
{{define "footer" }}
<script>console.log("ok");</script>
{{end}}
加载和渲染模板函数:
// 'templates' is a global variable
func LoadTemplates(files []string) {
templates = template.Must(template.New("myTemplates").ParseFiles(files...))
}
func Render(w http.ResponseWriter, tmpl string, data interface{}) {
templates.ExecuteTemplate(w, tmpl, data)
}
使用我的代码呈现登录页面:
// the following line is a simplification, actually I load all files together once.
LoadTemplates(string[]{"base.tmpl", "login.tmpl", "main.tmpl"})
Render(w, "login.tmpl", struct{}{})
使用我的代码呈现主要内容页面:
// the following line is a simplification, actually I load all files together once.
LoadTemplates(string[]{"base.tmpl", "login.tmpl", "main.tmpl"})
Render(w, "login.tmpl", struct{}{})
问题是内容块被覆盖了,因为它被覆盖了两次。所以,如果我呈现登录或主页,我会看到相同的内容。
1条答案
按热度按时间wgeznvg71#
解决方案是拥有多个模板“集”,答案如下:
https://stackoverflow.com/a/11468132/2908337