html - 无法从 html/template Golang 访问数据

标签 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 }}

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

最佳答案

首先,您应该检查 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 .

首先,您应该定义模板的结构,决定哪些模板包含其他模板,并执行“包装器”模板(使用Template.ExecuteTemplate())。当您执行一个调用/包含另一个模板的模板时,您可以告诉您要传递给其执行的值(数据)。当您编写 {{template "something".}} 时,这意味着您希望将点当前指向的值传递给名为 "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)

关于html - 无法从 html/template Golang 访问数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42625988/

相关文章:

python - 如何使用 pybind11 包装模板类

go - 如何在golang中获取项目中的包数

Golang 无法从 request.GetBody() 获取正文

go - 如何避免 go.mod 文件中的间接依赖

php - 爆炸复选框循环php

html - 折叠的导航按钮不会在 Bootstrap 中展开

javascript - 如何检测是否单击了形状(HTML5 Canvas )?

C++模板问题

css - 没有 javascript 的 Android 和 iPhone 的不同 css

c++ - 函数的推导