如何在每个模板中设置一个我可以在其他模板中使用的变量,例如
{{ 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>
答案 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}}
另外还有关于如何使用模板的很好的文档: