多次渲染定义同一块的golang模板

u4dcyp6a  于 2023-03-16  发布在  Go
关注(0)|答案(1)|浏览(103)

我有一个布局模板(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布局的第一指令,并且它们可以定义headercontentfooter块。
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{}{})

问题是内容块被覆盖了,因为它被覆盖了两次。所以,如果我呈现登录或主页,我会看到相同的内容。

相关问题