猿问

将一个模板渲染到另一个模板中,而无需每次都解析它们

我有三个这样的模板:


基地.html:


<h1>Base.html rendered here</h1>

{{template "content" .}}

视图.html:


{{define "content"}}

...

{{end}}

编辑.html:


{{define "content"}}

...

{{end}}

我将它们存储在文件夹“模板”中。


我想要的是动态更改将在 {{template "content" .}} 地方呈现的模板,而无需每次都进行解析。所以我不想要的是:


func main() {

   http.HandleFunc("/edit", handlerEdit)

   http.HandleFunc("/view", handlerView)

   http.ListenAndServe(":8080", nil)

}

func handlerView(w http.ResponseWriter, req *http.Request) {

   renderTemplate(w, req, "view")

}


func handlerEdit(w http.ResponseWriter, req *http.Request) {

   renderTemplate(w, req, "edit")

}


func renderTemplate(w http.ResponseWriter, req *http.Request, tmpl    string) {

   templates, err := template.ParseFiles("templates/base.html",  "templates/"+tmpl+".html")

   if err != nil {

       fmt.Println("Something goes wrong ", err)

       return

   }

   someData := &Page{Title: "QWE", Body: []byte("sample body")}

   templates.Execute(w, someData)

}

我在看 template.ParseGlobe(),为了做这样的事情


var templates = template.Must(template.ParseGlob("templates/*.html"))

... //and then somthing like this:

err := templates.ExecuteTemplate(w, tmpl+".html", p)

但是 ExecuteTamplate() 只接收一个字符串作为模板的名称。在这种情况下,我如何渲染两个或更多模板?


一只斗牛犬
浏览 154回答 1
1回答

翻过高山走不出你

不是http.ResponseWriter在调用 时直接写入 ,而是写入ExecuteTemplate字节缓冲区,然后通过调用准备调用将其发送到下一个模板template.HTML。var b bytes.Buffervar templates = template.Must(template.ParseGlob("templates/*.html"))err := templates.ExecuteTemplate(b, templ_1, p)if err != nil { //handle err }err := templates.ExecuteTemplate(w, templ_2, template.HTML(b.String()))if err != nil { //handle err }如果您要使用未知数量的模板,您可以使用字符串捕获中间步骤:var strtmp stringerr := templates.ExecuteTemplate(b, templ_1, p)if err != nil { //handle err }strtemp = b.String()&nbsp; //store the outputb.Reset()&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;//prep buffer for next template's outputerr := templates.ExecuteTemplate(b, templ_2, template.HTML(strtmp))if err != nil { //handle err }//... until all templates are appliedb.WriteTo(w)&nbsp; //Send the final output to the ResponseWriter编辑:正如@Zhuharev 指出的,如果视图和编辑模板的组成是固定的,它们都可以引用 base 而不是 base 试图提供对视图或编辑的引用:{{define "viewContent"}}{{template "templates/base.html" .}}...Current view.html template...{{end}}{{define "editContent"}}{{template "templates/base.html" .}}...Current edit.html template...{{end}}
随时随地看视频慕课网APP

相关分类

Go
我要回答