将数据传递给嵌套模板不能按预期工作

时间:2018-02-04 20:02:12

标签: http parsing go nested go-templates

我试图使用html/template将结构传递给Go中的嵌套模板,并尝试使用template.ParseFilestemplate.ParseGlob来实现它,但它不能按照我的期望是因为我的理解不明确。

我的文件header.html的模板代码是

{{define "header"}}
<!DOCTYPE html>
<html lang="en">
<head>
    <link href="https://use.fontawesome.com/releases/v5.0.6/css/all.css" rel="stylesheet">
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title> SiteAdmin - {{.User}}</title>
</head>
{{end}} 

并且文件admin.html

{{template "header"}}
<body>
"User is {{.User}}"
</body>
</html>

我在类型*模板上使用Execute方法

type Admin struct {
    User string
}


data := new(Admin)
data.User = "Guest"
tpl, err := template.ParseGlob("views/templates/admin/*.html")
CheckForErr(err)
err = tpl.Execute(w, data)
CheckForErr(err)

使用上面的代码,我可以将结构数据传递给admin.html,并在浏览器中显示User is Guest。但是,如果我尝试将其传递给任何嵌套模板,它就不会。该网页标题仍显示为SiteAdmin -而非SiteAdmin - Guest。只有当我在User文件中将其称为{{.User}}时,结构中的admin.html数据才可见,并且嵌套模板中对它的任何引用都不会被传递。这是可以实现的吗?

谢谢大家。

1 个答案:

答案 0 :(得分:1)

您需要使用{{ template "header" . }}。正如text/template中的文件所说:

  

{{template“name”pipeline}}

     

具有指定名称的模板使用点集执行       到管道的价值。

在这种情况下,您传入的管道是.,它引用了整个data

http/template的文件大部分位于text/template,这在某种程度上不方便。