GO: Голангтағы бірнеше үлгілерді қалай беру керек?

Бір негізгі үлгі жасалды. Бұл бірінші.html тағы бір шаблонды көрсетті.

eg. :
    var tmpl = template.Must(template.ParseFiles(
    "templates/base.html",
    "templates/first.html",
    ))

Бірақ мен көрсету үшін .html файлдарын қосқым келеді. Кез келген сілтеме?

25
Үшінші файлды қосып көргенде не дұрыс емес?
қосылды автор ANisus, көзі
Үшінші файлды қосып көргенде не дұрыс емес?
қосылды автор ANisus, көзі

7 жауаптар

Шаблон-қалтасында барлық үлгілерді анықтасаңыз, бүкіл каталогты оңай қарап шығуға болады:

template.Must(template.ParseGlob("YOURDIRECTORY/*"))

Мысалға:

head.html

{{define "header"}}
     <head>
         <title>Index</title>
     </head>
{{end}}

index.html

{{define "indexPage"}}
    <html>
    {{template "header"}}
    <body>
        

Index

    </body>
    </html>
{{end}}

main.go

package main

import(
    "html/template"
)

// compile all templates and cache them
var templates = template.Must(template.ParseGlob("YOURTEMPLATEDIR/*"))

func main(){
    ...
}

func IndexHandler(w http.ResponseWriter, r *http.Request) {

   //you access the cached templates with the defined name, not the filename
    err := templates.ExecuteTemplate(w, "indexPage", nil)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

You execute your indexPage-Template with templates.ExecuteTemplate(w, "indexPage", nil)

75
қосылды
Мен бұл жауапты типтерді түзету және қателерді компиляциялау үшін жаңарттым. +1, бұл маған бірнеше үлгіні дұрыс анықтауға көмектеседі. Ең алдымен, көпшілігімізден .net және басқа тілдерден тек бір ғана мастер мен бірыңғай мазмұн аумағын жасамайтын орналасу және үлгілермен бірге келетіндіктен, ортақ тақырып және төменгі деректемелер мен бүйірлік тақталарды анықтайды. Бұл шын мәнінде жақсы, себебі сіз бүйірлік тақтаны көрсетуге немесе бақылауға болмайды.
қосылды автор eduncan911, көзі
Бұл қабылданған жауап болуы керек. Бұл жауап құжаттамадан әлдеқайда анық. Ол сіз өзіңіздің барлық үлгілеріңізді серверді іске қосу орнына нақты жүктеушінің орнына (әрбір бет жүктеуіне жүктелетін) жүктеу үшін жаһандық templates айнымалысын қалай пайдалану керектігін көрсетеді. Сондай-ақ, шаблонды атаумен қалай анықтау керектігін, содан кейін оны templates.ExecuteTemplate арқылы супер пайдалы деп атайды. Осы тақырып бойынша мен көрген ең жақсы құжаттарды ...
қосылды автор swill, көзі
Сіздің мәлімдемеңіз жалған, ол: Барлық үлгілеріңіз үлгілерде/.tmpl/.* каталогы
қосылды автор ioboi, көзі
: main.go: var templates template.Template templates = template.Must (template.ParseGlob («templates/ .tmpl»)) func init() {http.HandleFunc («/», өңдегіш) } func handler (w http.ResponseWriter, r * http.Request) {templates.ExecuteTemplate (w, «indexPage», nil) Бұл мысал «күтілетін мәлімдеме, табылған» IDENT «үлгілері»
қосылды автор fmt.Fprint, көзі

Сіз оларды дәлел ретінде қосу арқылы оңай .html файлдарын оңай қосуға болады:

var tmpl = template.Must(template.ParseFiles(
    "templates/base.html",
    "templates/first.html",
    "templates/second.html",
))

Бұл бірінші және екінші нұсқасы бір қалыпты анықтамағанша жақсы жұмыс істейді  Дегенмен, үлгі пакеті үлгіні динамикалық шақыруына мүмкіндік бермейді, үлгі атының құбыр мәнін пайдаланып. Сондықтан төмендегі мысалға ұқсас нәрсені жасауға тырыссаңыз, ол жұмыс істемейді.

Кейбір шешімдер бар және бұл туралы Жаңғақтар туралы талқылау бар . Бірақ, үлгі бумасы бір бет үшін * Template нысаны болуы керек деп есептеледі.

Broken example of attempted dynamic template invocation:
Error: unexpected ".Content" in template invocation

package main

import (
    "log"
    "os"
    "text/template"
)

const base= `<!DOCTYPE HTML>
<html>
    <head><title>Title</title></head>
<body>
    {{template .Content}}
</body>
</html>`

const first = `{{define "first"}}This is the first page{{end}}`
const second = `{{define "second"}}And here is the second{{end}}`

type View struct {
    Content  string
}

func main() {
    var view = &View{ "first" }//Here we try to set which page to view as content
    t := template.Must(template.New("base").Parse(base))
    t = template.Must(t.Parse(first))
    t = template.Must(t.Parse(second))
    err := t.Execute(os.Stdout, view)
    if err != nil {
        log.Println("executing template:", err)
    }
}

play.golang.org ішіндегі код

6
қосылды
@ fmt.Fprint Мен сіздердің үлгілеріңіз бен өңдеушілерге арналған құрылымды алу керек деп ойлаймын. Kyle Finley бұл үшін жақсы ұсыныс бар: ( stackoverflow.com/a/9587616/694331 )
қосылды автор ANisus, көзі
Мен голангқа мүлдем жаңа болып шықтым, бірақ мәселе, үлгісі әдісіне айнымалы жол түрін айналдыра алмайсыз, бірақ тек жолдың литералы дегенді білдіреді. Мен сондай-ақ CS guy емеспін, GO әзірлеушілерінің бұл таңдауды жасауының айқын себебі бар ма? {{template «name»}} Көрсетілген атау үлгісі нөлдік деректермен орындалады. Мен жай ғана жазғанын білмедім « атауының жолын жазуға емес, жолдың литералын белгілеу керек.
қосылды автор wuliwong, көзі
Бұл сілтеме қазірдің өзінде сыналған. base.html және first.html жақсы. Бірақ үшінші және төртінші мәселе
қосылды автор fmt.Fprint, көзі
ANisus: Егер мен бірінші беттің батырмасында оқиға триггерін нұқсам, онда ол аталған басқа бетті көрсету керек ... Қайта бағыттау және renderTemplate функциялары бар, бірақ олар да жұмыс істемейді. Base.html және first.html үшін бетті көрсете аламын. Бірақ үшінші html беті үшін ол жұмыс істемейді
қосылды автор fmt.Fprint, көзі

Сіз оларды дәлел ретінде қосу арқылы оңай .html файлдарын оңай қосуға болады:

var tmpl = template.Must(template.ParseFiles(
    "templates/base.html",
    "templates/first.html",
    "templates/second.html",
))

Бұл бірінші және екінші нұсқасы бір қалыпты анықтамағанша жақсы жұмыс істейді  Дегенмен, үлгі пакеті үлгіні динамикалық шақыруына мүмкіндік бермейді, үлгі атының құбыр мәнін пайдаланып. Сондықтан төмендегі мысалға ұқсас нәрсені жасауға тырыссаңыз, ол жұмыс істемейді.

Кейбір шешімдер бар және бұл туралы Жаңғақтар туралы талқылау бар . Бірақ, үлгі бумасы бір бет үшін * Template нысаны болуы керек деп есептеледі.

Broken example of attempted dynamic template invocation:
Error: unexpected ".Content" in template invocation

package main

import (
    "log"
    "os"
    "text/template"
)

const base= `<!DOCTYPE HTML>
<html>
    <head><title>Title</title></head>
<body>
    {{template .Content}}
</body>
</html>`

const first = `{{define "first"}}This is the first page{{end}}`
const second = `{{define "second"}}And here is the second{{end}}`

type View struct {
    Content  string
}

func main() {
    var view = &View{ "first" }//Here we try to set which page to view as content
    t := template.Must(template.New("base").Parse(base))
    t = template.Must(t.Parse(first))
    t = template.Must(t.Parse(second))
    err := t.Execute(os.Stdout, view)
    if err != nil {
        log.Println("executing template:", err)
    }
}

play.golang.org ішіндегі код

6
қосылды
@ fmt.Fprint Мен сіздердің үлгілеріңіз бен өңдеушілерге арналған құрылымды алу керек деп ойлаймын. Kyle Finley бұл үшін жақсы ұсыныс бар: ( stackoverflow.com/a/9587616/694331 )
қосылды автор ANisus, көзі
Мен голангқа мүлдем жаңа болып шықтым, бірақ мәселе, үлгісі әдісіне айнымалы жол түрін айналдыра алмайсыз, бірақ тек жолдың литералы дегенді білдіреді. Мен сондай-ақ CS guy емеспін, GO әзірлеушілерінің бұл таңдауды жасауының айқын себебі бар ма? {{template «name»}} Көрсетілген атау үлгісі нөлдік деректермен орындалады. Мен жай ғана жазғанын білмедім « атауының жолын жазуға емес, жолдың литералын белгілеу керек.
қосылды автор wuliwong, көзі
Бұл сілтеме қазірдің өзінде сыналған. base.html және first.html жақсы. Бірақ үшінші және төртінші мәселе
қосылды автор fmt.Fprint, көзі
ANisus: Егер мен бірінші беттің батырмасында оқиға триггерін нұқсам, онда ол аталған басқа бетті көрсету керек ... Қайта бағыттау және renderTemplate функциялары бар, бірақ олар да жұмыс істемейді. Base.html және first.html үшін бетті көрсете аламын. Бірақ үшінші html беті үшін ол жұмыс істемейді
қосылды автор fmt.Fprint, көзі

Сіз оларды дәлел ретінде қосу арқылы оңай .html файлдарын оңай қосуға болады:

var tmpl = template.Must(template.ParseFiles(
    "templates/base.html",
    "templates/first.html",
    "templates/second.html",
))

Бұл бірінші және екінші нұсқасы бір қалыпты анықтамағанша жақсы жұмыс істейді  Дегенмен, үлгі пакеті үлгіні динамикалық шақыруына мүмкіндік бермейді, үлгі атының құбыр мәнін пайдаланып. Сондықтан төмендегі мысалға ұқсас нәрсені жасауға тырыссаңыз, ол жұмыс істемейді.

Кейбір шешімдер бар және бұл туралы Жаңғақтар туралы талқылау бар . Бірақ, үлгі бумасы бір бет үшін * Template нысаны болуы керек деп есептеледі.

Broken example of attempted dynamic template invocation:
Error: unexpected ".Content" in template invocation

package main

import (
    "log"
    "os"
    "text/template"
)

const base= `<!DOCTYPE HTML>
<html>
    <head><title>Title</title></head>
<body>
    {{template .Content}}
</body>
</html>`

const first = `{{define "first"}}This is the first page{{end}}`
const second = `{{define "second"}}And here is the second{{end}}`

type View struct {
    Content  string
}

func main() {
    var view = &View{ "first" }//Here we try to set which page to view as content
    t := template.Must(template.New("base").Parse(base))
    t = template.Must(t.Parse(first))
    t = template.Must(t.Parse(second))
    err := t.Execute(os.Stdout, view)
    if err != nil {
        log.Println("executing template:", err)
    }
}

play.golang.org ішіндегі код

6
қосылды
@ fmt.Fprint Мен сіздердің үлгілеріңіз бен өңдеушілерге арналған құрылымды алу керек деп ойлаймын. Kyle Finley бұл үшін жақсы ұсыныс бар: ( stackoverflow.com/a/9587616/694331 )
қосылды автор ANisus, көзі
Мен голангқа мүлдем жаңа болып шықтым, бірақ мәселе, үлгісі әдісіне айнымалы жол түрін айналдыра алмайсыз, бірақ тек жолдың литералы дегенді білдіреді. Мен сондай-ақ CS guy емеспін, GO әзірлеушілерінің бұл таңдауды жасауының айқын себебі бар ма? {{template «name»}} Көрсетілген атау үлгісі нөлдік деректермен орындалады. Мен жай ғана жазғанын білмедім « атауының жолын жазуға емес, жолдың литералын белгілеу керек.
қосылды автор wuliwong, көзі
Бұл сілтеме қазірдің өзінде сыналған. base.html және first.html жақсы. Бірақ үшінші және төртінші мәселе
қосылды автор fmt.Fprint, көзі
ANisus: Егер мен бірінші беттің батырмасында оқиға триггерін нұқсам, онда ол аталған басқа бетті көрсету керек ... Қайта бағыттау және renderTemplate функциялары бар, бірақ олар да жұмыс істемейді. Base.html және first.html үшін бетті көрсете аламын. Бірақ үшінші html беті үшін ол жұмыс істемейді
қосылды автор fmt.Fprint, көзі

Осы оқулықтың 3-бөлігі пайдалы:

http://golangtutorials.blogspot.co .nz/2011/11/go-templates-part-3-template-sets.html

Оқулықтан алынған үлгі:

Full template file - t1.tmpl

{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}

Жоғарыдағы файл «t_ab» деп аталатын үлгі ретінде талданатын болады. Бұл жерде «b/missing/e f» бар, бірақ әліпбидегі бірнеше әріп жоқ. Ол үшін «t_cd» деп аталатын тағы бір үлгісін (сол жиынта болуы керек) қосуды жоспарлайды.

Full template file - t2.tmpl

{{define "t_cd"}} c d {{end}}

Жоғарыдағы файл «t_cd» деп аталатын үлгі ретінде талданатын болады.

Толық бағдарлама

package main

import (
    "text/template"
    "os"
    "fmt"
    )

func main() {
    fmt.Println("Load a set of templates with {{define}} clauses and execute:")
    s1, _ := template.ParseFiles("t1.tmpl", "t2.tmpl") //create a set of templates from many files.
    //Note that t1.tmpl is the file with contents "{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}"
    //Note that t2.tmpl is the file with contents "{{define "t_cd"}} c d {{end}}"


    s1.ExecuteTemplate(os.Stdout, "t_cd", nil) //just printing of c d
    fmt.Println()
    s1.ExecuteTemplate(os.Stdout, "t_ab", nil) //execute t_ab which will include t_cd
    fmt.Println()
    s1.Execute(os.Stdout, nil) //since templates in this data structure are named, there is no default template and so it prints nothing
}
1
қосылды

Осы оқулықтың 3-бөлігі пайдалы:

http://golangtutorials.blogspot.co .nz/2011/11/go-templates-part-3-template-sets.html

Оқулықтан алынған үлгі:

Full template file - t1.tmpl

{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}

Жоғарыдағы файл «t_ab» деп аталатын үлгі ретінде талданатын болады. Бұл жерде «b/missing/e f» бар, бірақ әліпбидегі бірнеше әріп жоқ. Ол үшін «t_cd» деп аталатын тағы бір үлгісін (сол жиынта болуы керек) қосуды жоспарлайды.

Full template file - t2.tmpl

{{define "t_cd"}} c d {{end}}

Жоғарыдағы файл «t_cd» деп аталатын үлгі ретінде талданатын болады.

Толық бағдарлама

package main

import (
    "text/template"
    "os"
    "fmt"
    )

func main() {
    fmt.Println("Load a set of templates with {{define}} clauses and execute:")
    s1, _ := template.ParseFiles("t1.tmpl", "t2.tmpl") //create a set of templates from many files.
    //Note that t1.tmpl is the file with contents "{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}"
    //Note that t2.tmpl is the file with contents "{{define "t_cd"}} c d {{end}}"


    s1.ExecuteTemplate(os.Stdout, "t_cd", nil) //just printing of c d
    fmt.Println()
    s1.ExecuteTemplate(os.Stdout, "t_ab", nil) //execute t_ab which will include t_cd
    fmt.Println()
    s1.Execute(os.Stdout, nil) //since templates in this data structure are named, there is no default template and so it prints nothing
}
1
қосылды

Осы оқулықтың 3-бөлігі пайдалы:

http://golangtutorials.blogspot.co .nz/2011/11/go-templates-part-3-template-sets.html

Оқулықтан алынған үлгі:

Full template file - t1.tmpl

{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}

Жоғарыдағы файл «t_ab» деп аталатын үлгі ретінде талданатын болады. Бұл жерде «b/missing/e f» бар, бірақ әліпбидегі бірнеше әріп жоқ. Ол үшін «t_cd» деп аталатын тағы бір үлгісін (сол жиынта болуы керек) қосуды жоспарлайды.

Full template file - t2.tmpl

{{define "t_cd"}} c d {{end}}

Жоғарыдағы файл «t_cd» деп аталатын үлгі ретінде талданатын болады.

Толық бағдарлама

package main

import (
    "text/template"
    "os"
    "fmt"
    )

func main() {
    fmt.Println("Load a set of templates with {{define}} clauses and execute:")
    s1, _ := template.ParseFiles("t1.tmpl", "t2.tmpl") //create a set of templates from many files.
    //Note that t1.tmpl is the file with contents "{{define "t_ab"}}a b{{template "t_cd"}}e f {{end}}"
    //Note that t2.tmpl is the file with contents "{{define "t_cd"}} c d {{end}}"


    s1.ExecuteTemplate(os.Stdout, "t_cd", nil) //just printing of c d
    fmt.Println()
    s1.ExecuteTemplate(os.Stdout, "t_ab", nil) //execute t_ab which will include t_cd
    fmt.Println()
    s1.Execute(os.Stdout, nil) //since templates in this data structure are named, there is no default template and so it prints nothing
}
1
қосылды