代码之家  ›  专栏  ›  技术社区  ›  pigfox

模板变量不能到处解析

  •  0
  • pigfox  · 技术社区  · 3 年前

    package main
    
    import (
        "fmt"
        "html/template"
        "log"
        "net/http"
    
        "github.com/gorilla/handlers"
        "github.com/gorilla/mux"
    )
    
    type Data struct {
        Title string
        Field1 string
        Field2 template.HTML
        FooterField string
    }
    
    var tmpl *template.Template
    
    func main() {
        router := mux.NewRouter()
    
        port := ":8085"
        data := Data{}
        data.Title = "Title"
        data.FooterField = "This text does not appear in the footer template"
    
        router.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
            err := tmpl.ExecuteTemplate(w, "index", data)
            if err != nil {
                http.Error(w, err.Error(), http.StatusInternalServerError)
            }
        })
    
        var err error
        tmpl, err = template.ParseGlob("views/*")
        if err != nil {
            panic(err.Error())
        }
    
        router.PathPrefix("/").HandlerFunc(func(res http.ResponseWriter, req *http.Request) {
            http.FileServer(http.Dir("./static/")).ServeHTTP(res, req)
        })
    
        fmt.Println("Server running on localhost" + port)
    
        err = http.ListenAndServe(port, handlers.CompressHandler(router))
        if err != nil {
            log.Fatal(err)
        }
    }
    

    {{define "header"}}<!doctype html><html lang="en"><head><meta charset="utf-8"><title>{{.Title}}</title></head><body><h1>Header template</h1><div>{{.FooterField}}</div>{{end}}
    

    index.html

    {{define "index"}}{{template "header" . }}
    <h1>Index template</h1>
    <div>{{.FooterField}}</div>
    {{template "footer"}}{{end}}
    

    {{define "footer"}}<h1>Footer template</h1>
    Missing FooterField->{{.FooterField}}</body></html>{{end}}
    

    最后是浏览器中的输出http://localhost:8085/

    Header template
    This text does not appear in the footer template
    Index template
    This text does not appear in the footer template
    Footer template
    Missing FooterField->
    

    此代码应该能够通过简单的复制和粘贴来复制。

    1 回复  |  直到 3 年前
        1
  •  3
  •   Magus    3 年前

    您没有向页脚模板传递任何内容。但是你通过了 . 添加到标题模板,这样您就可以看到 .FooterField 只有那里。

    index.html 将其更改为: {{template "footer" . }}