如何使用通用零件渲染多个模型的模板

时间:2019-02-02 00:08:59

标签: go go-html-template

我的golang项目中有很多带有CRUD视图的模型,我想使用通用的页眉和页脚来呈现这些模型,但无法弄清楚该怎么做。我看过的例子太简单了。

假设我有一个像这样的模板结构:

templates
  - layouts
    - header.tmpl
    - footer.tmpl
  - users
    - index.tmpl
    - new.tmpl
    - edit.tmpl
    - show.tmpl   
  - venues
    - index.tmpl
    - new.tmpl
    - edit.tmpl
    - show.tmpl   

如何使用通用的页眉和页脚为指定模型呈现这些模板?

1 个答案:

答案 0 :(得分:1)

以下只是一个准系统的解决方案:

package main

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

func main() {
    //read in one go the header, footer and all your other tmpls.
    //append to that slice every time the relevant content that you want rendered.
    alltmpls := []string{"./layouts/header.tmpl", "./layouts/footer.tmpl", "./users/index.tmpl"}
    templates, err := template.ParseFiles(alltmpls...)
    t := templates.Lookup("header.tmpl")
    t.ExecuteTemplate(os.Stdout, "header", nil)
    t = templates.Lookup("index.tmpl")
    t.ExecuteTemplate(os.Stdout, "index", nil)
    t = templates.Lookup("footer.tmpl")
    t.ExecuteTemplate(os.Stdout, "footer", nil)
}

实际上,您需要一个函数,该函数返回适当文件的一部分以填充alltmpls变量。它应该扫描目录并从中获取所有文件,然后传递给ParseFiles(),然后继续为每个模板调用Lookup和ExecuteTemplate步骤。

进一步考虑这个想法,我将创建一个新类型,该类型将嵌入要由页眉和页脚注释的模板(或模板切片)。

type hftemplate struct {
    template.Template
    header, footer *template.Template
}

func (h *hftemplate) ExecuteTemplate(wr io.Writer, name string, data interface{}) error {
    h.header.ExecuteTemplate(wr, "header", nil)
    err := h.ExecuteTemplate(wr, name, data)
    h.footer.ExecuteTemplate(wr, "footer", nil)
    return err
}

当然,您可以将该结构嵌入到[] Template的完整字段中,以在页眉和页脚之间执行多个ExecuteTemplate。