无法从html /模板Golang访问数据

时间:2017-03-06 12:43:23

标签: html templates go go-templates

我有三个连接的模板。 base.htmlmenu.htmlusers.html。但是当我执行这些模板时,我只能从base.html

访问上下文数据

这是我的处理程序:

func HandlerUser(res http.ResponseWriter, req *http.Request){
if req.Method == "GET" {
    context := Context{Title: "Users"}
    users,err:= GetUser(0)
    context.Data=map[string]interface{}{
        "users": users,
    }
    fmt.Println(context.Data)
    t,err := template.ParseFiles("public/base.html")
    t,err = t.ParseFiles("public/menu.html")
    t,err = t.ParseFiles("public/users.html")
    err = t.Execute(res,context)
    fmt.Println(err)
 }
}

这是我想在用户模板中显示的内容

{{ range $user := index .Data "users" }}
<tr id="user-{{ .Id }}">
    <td id="cellId" >{{ $user.Id }}</td>
    <td id="cellUserName" >{{ $user.UserName }}</td>
</tr>
{{ end }}

注意:我可以访问"{{.Title}}"模板中使用的base.html

1 个答案:

答案 0 :(得分:1)

首先,您应该检查Template.ParseFiles()方法返回的错误。您存储了返回的错误,但您只在最后检查它(然后它会被覆盖3次)。

接下来,永远不要解析请求处理程序中的模板,它太耗费时间和资源浪费。在启动时(或首次要求)执行一次。有关详细信息,请参阅It takes too much time when using "template" package to generate a dynamic web page to client in golang

接下来,您可以一次解析多个文件,只需在传递到Template.ParseFiles() 函数时枚举所有文件(有方法和函数)。

知道Template.Execute()仅执行单个(命名)模板。您有3个关联的模板,但只有"base.html"模板由您的代码执行。要执行特定的命名模板,请使用Template.ExecuteTemplate()。有关详细信息,请参阅Telling Golang which template to execute first

首先,您应该定义模板的结构,确定哪些模板包含其他模板,然后执行&#34;包装器&#34;模板(使用Template.ExecuteTemplate())。当您执行调用/包含另一个模板的模板时,您可以告诉您要将哪些值(数据)传递给它的执行。当您编写{{template "something" .}}时,这意味着您希望将当前由dot指向的值传递给名为"something"的模板的执行。阅读更多相关信息:golang template engine pipelines

要了解有关模板关联和内部的更多信息,请阅读以下答案:Go template name

因此,在您的情况下,我会想象"base.html"是包装器外部模板,其中包含"menu.html""users.html"。因此"base.html"应包含与此类似的行:

{{template "menu.html" .}}

{{template "users.html" .}}

以上几行将调用并包含所提到模板的结果,将数据传递给传递给"base.html"的执行(如果点未更改)。

使用template.ParseFiles() 功能(非方法)解析文件,如下所示:

var t *template.Template

func init() {
    var err error
    t, err = template.ParseFiles(
        "public/base.html", "public/menu.html", "public/users.html")
    if err != nil {
        panic(err) // handle error
    }
}

在你的处理程序中执行它:

err := t.ExecuteTemplate(w, "base.html", context)