为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
一只斗牛犬 2021-11-08 14:37:52
我有三个这样的模板:基地.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() 只接收一个字符串作为模板的名称。在这种情况下,我如何渲染两个或更多模板?
查看完整描述

1 回答

?
翻过高山走不出你

TA贡献1875条经验 获得超3个赞

不是http.ResponseWriter在调用 时直接写入 ,而是写入ExecuteTemplate字节缓冲区,然后通过调用准备调用将其发送到下一个模板template.HTML。


var b bytes.Buffer


var 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 string

err := templates.ExecuteTemplate(b, templ_1, p)

if err != nil { //handle err }


strtemp = b.String()  //store the output

b.Reset()             //prep buffer for next template's output


err := templates.ExecuteTemplate(b, templ_2, template.HTML(strtmp))

if err != nil { //handle err }


//... until all templates are applied


b.WriteTo(w)  //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}}


查看完整回答
反对 回复 2021-11-08
  • 1 回答
  • 0 关注
  • 153 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信