3 回答
TA贡献1876条经验 获得超5个赞
我认为,在解析模板后调整路径为时已晚。
可行的方法(虽然我不确定这里是否是最优雅的解决方案)是使用以下AddParseTree
方法:
AddParseTree 为具有给定名称的模板添加解析树并将其与 t 相关联。如果模板尚不存在,它将创建一个新模板。如果模板确实存在,它将被替换。
适用于您的情况,根据您将Parse
相关模板文件(子模板 1 或 2)的条件,然后在执行之前将其添加到AddParseTree
to 。tpl
TA贡献1810条经验 获得超4个赞
最后我让它工作了,但只有在不遵循手册的情况下。
解决方案第 1 部分
跳过模板中的 {{define}} 和 {{end}}。诡异的...
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Go Web Programming</title>
</head>
<body>
layout level
{{ template "content" . }}
</body>
</html>
在子模板中也是如此......
<h1 style="color: red;">Page 1!</h1>
解决方案第 2 部分
我找到了一个带有 AddParsTree 的代码片段,这是代码(经过简化,没有错误处理)
package main
import (
"html/template"
"net/http"
"strings"
)
var tpl *template.Template
func init() {
tpl = template.Must(template.ParseGlob("templates/*.html"))
}
func main() {
http.HandleFunc("/", index)
http.ListenAndServe(":8080", nil)
}
func index(w http.ResponseWriter, r *http.Request) {
path := strings.Trim(r.URL.Path, "/")
switch path {
case "":
path = ("home.html")
default:
path = (path + ".html")
}
layout := tpl.Lookup("layout.html")
layout, _ = layout.Clone()
t := tpl.Lookup(path)
_, _ = layout.AddParseTree("content", t.Tree)
layout.Execute(w, "")
我真的不明白为什么我必须不遵守手册才能让它工作。任何启发我的评论将不胜感激。
TA贡献1772条经验 获得超8个赞
我遇到了同样的问题并以这种方式解决了它:
这对我来说适用于{{ define "content1" }}...{{ end }}语法,但你必须给你的模板唯一的名称:content1和content2。
我制作了一个用于处理模板内容的包。
package templates
import (
"html/template"
"log"
"net/http"
)
var tmpls *template.Template
// LoadTemplates parses a template folder
func LoadTemplates(tmplPath string) {
tmpls = template.Must(template.ParseGlob(tmplPath))
}
// ExecTmpl executes a template and writes it
func ExecTmpl(w http.ResponseWriter, tmpl string, data interface{}) {
tmpls.ExecuteTemplate(w, tmpl, data)
}
// ExecTmplTree combines and executes two templates
func ExecTmplTree(w http.ResponseWriter, outer, inner string, data interface{}) {
layout, err := tmpls.Lookup(outer).Clone()
if err != nil || layout == nil {
log.Fatal("ExecTmplTree: Could not get a copy of template", outer)
}
content, err := tmpls.Lookup(inner).Clone()
if err != nil || content == nil {
log.Fatal("ExecTmplTree: Could not get a copy of template", inner)
}
_, err = layout.AddParseTree("content", content.Tree)
if err != nil {
log.Fatal("ExecTmplTree: Templates could not be combined.")
}
layout.Execute(w, data)
}
然后我调用函数如下(在 main.go 或其他地方):
// call first to load templates from the folder where your templates are stored
// you might need fit the file ending, too, I simply use .html for html-templates
func init() {
templates.LoadTemplates("web/templates/*.html")
}
// write a basic template without nesting
func exampleHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecTmplTree(w, "content1", "messageForm", nil)
}
// write nested templates. here, index is the outer template
// and code is the inner
func indexHandler(w http.ResponseWriter, r *http.Request) {
templates.ExecTmplTree(w, "layout", "content1", nil)
}
- 3 回答
- 0 关注
- 121 浏览
添加回答
举报