2015-06-03 2 views
6

Wie kann ich eine Variable in jeder Vorlage festlegen, die ich in anderen Vorlagen verwenden kann, z.Mit Golang Templates Wie kann ich eine Variable in jeder Vorlage festlegen?

{{ set title "Title" }}

in einer Vorlage dann in meinem Layout

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

Dann, wenn es gemacht ist

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

es wird den Titelsatz nach, was auch immer in home.html gesetzt wurde anstatt eine 0 zu machenfür jede Ansichtsseite, wenn es nicht wirklich notwendig ist. Ich hoffe ich habe Sinn gemacht, danke.

Nur zur Klarstellung:

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

    </body> 
</html> 

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

Antwort

7

Wenn Sie den Wert in einer anderen Vorlage verwenden Pipeline Sie können es auf den Punkt:

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

Körpervorlage:

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

Soweit ich weiß, ist es nicht möglich, in der Kette nach oben zu gehen. So layout.html wird vor home.html gerendert, so dass Sie einen Wert zurück übergeben können.

In Ihrem Beispiel wäre es die beste Lösung sein, eine Struktur zu verwenden und sie von den layout.html zum home.html mit dem dot passieren:

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}} 

seite.html

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

Auch gehen hat eine schöne Dokumentation, wie Vorlagen verwenden:

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

Verwandte Themen