使用Golang模板,如何在每个模板中设置变量?

时间:2015-06-03 01:45:44

标签: templates go

如何在每个模板中设置一个我可以在其他模板中使用的变量,例如

{{ set title "Title" }}

在一个模板中,然后在我的布局中

<title> {{ title }} </title>

然后当它被渲染

tmpl, _ := template.ParseFiles("layout.html", "home.html")

它会根据home.html中设置的内容设置标题,而不是必须为每个视图页面设置struct。我希望我有道理,谢谢。

只是为了澄清:

layout.html:
<!DOCTYPE html>
<html>
  <head>
    <title>{{ title }} </title>
  </head>
  <body>

  </body>
</html>

home.html:
{{ set Title "Home" . }}
<h1> {{ Title }} Page </h1>

1 个答案:

答案 0 :(得分:7)

如果要在另一个模板中使用Value,可以将其传递给点:

{{with $title := "SomeTitle"}}
{{$title}} <--prints the value on the page
{{template "body" .}}
{{end}}

正文模板:

{{define "body"}}
<h1>{{.}}</h1> <--prints "SomeTitle" again
{{end}}

据我所知,链条上不可能向上。 因此layout.html会在home.html之前呈现,因此您无法传回值。

在您的示例中,使用结构并使用layout.html将其从home.html传递到dot将是最佳解决方案:

<强> main.go

package main

import (
    "html/template"
    "net/http"
)

type WebData struct {
    Title string
}

func homeHandler(w http.ResponseWriter, r *http.Request) {
    tmpl, _ := template.ParseFiles("layout.html", "home.html")
    wd := WebData{
        Title: "Home",
    }
    tmpl.Execute(w, &wd)
}

func pageHandler(w http.ResponseWriter, r *http.Request) {
    tmpl, _ := template.ParseFiles("layout.html", "page.html")
    wd := WebData{
        Title: "Page",
    }
    tmpl.Execute(w, &wd)
}

func main() {
    http.HandleFunc("/home", homeHandler)
    http.HandleFunc("/page", pageHandler)
    http.ListenAndServe(":8080", nil)
}

<强>的layout.html

<!DOCTYPE html>
<html>
  <head>
    <title>{{.Title}} </title>
  </head>
  <body>
    {{template "body" .}}
  </body>
</html>

<强> home.html的

{{define "body"}}
<h1>home.html {{.Title}}</h1>
{{end}}

<强> page.html中

{{define "body"}}
<h1>page.html {{.Title}}</h1>
{{end}}

另外还有关于如何使用模板的很好的文档:

http://golang.org/pkg/text/template/