2

给定一组模板,例如:

布局.tpl

<html>
<head>
<title>Some title</title>
{{template extracss}}
</head>
<body>
<h1>Page title</h1>
{{template content .}}
</body>
</html>

主页.tpl

{{define "content"}}
<p>page content goes here</p>
{{end}}

编辑.tpl

{{define "content"}}
<form>form content goes here</form>
{{end}}

{{define "extracss"}}<style>body{background:pink}</style>{{end}}

使用它来呈现模板:

func Render(w http.ResponseWriter, tmpname string, data interface{}) {

    t, err := template.ParseFiles("views/layout.tpl", "views/"+tmpname+".tpl")
    // parse error
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }

    if err := t.Execute(w, data); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}

edit.tpl 将正确呈现,因为它定义了“extracss”,home.tpl 不会因为模板解析器正确地说“没有这样的模板“extracss””。

那么我将使用什么机制来允许使用“可选”模板?

有任何想法吗?

4

2 回答 2

3

一个空的定义有效:{{define "extracss"}}{{end}}. 它可能不是超级优雅,但很容易理解。

请注意,您不需要重复空定义。您可以将它们放入主模板并仅在需要时在包含的模板中重新定义它们。

于 2013-03-25T14:28:08.267 回答
0

@thomas 的答案很棒,但我发现他写的内容模棱两可,浪费了很多时间试图将其翻译成代码。

这是有效的代码(我相信这是他的建议):

布局.tpl

<html>
  <head>
    <title>Some title</title>
    {{template extracss}}
    {{define "extracss"}}{{end}}
  </head>
  <body>
    <h1>Page title</h1>
    {{template content .}}
  </body>
</html>

主页.tpl

{{define "content"}}
  <p>page content goes here</p>
{{end}}

编辑.tpl

{{define "content"}}
  <form>form content goes here</form>
{{end}}

{{define "extracss"}}<style>body{background:pink}</style>{{end}}

使用它来呈现模板:

func Render(w http.ResponseWriter, tmpname string, data interface{}) {

    t, err := template.ParseFiles("views/layout.tpl", "views/"+tmpname+".tpl")
    // parse error
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
       
    if err := t.Execute(w, data); err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
    }
}
于 2020-07-08T19:54:53.490 回答