为什么我解析的 HTML 个模板不起作用?
Why don't HTML templates that I have parsed work?
我分析了我的模板文件,使我的工作更轻松。
我给它们取名{{define "pagearea"}}
。
例如 {{define "footer"}}
.
文件夹布局
- footer.tmpl - 页脚区域
- index.tmpl - 我的主页
- main.go - 去代码:)
- topheader.tmpl - 顶部的一部分 html
main.go
package main
import (
"log"
"os"
"html/template"
)
type Home struct {
Sitelang string
Sitetitle string
Sitename string
Siteslogan string
}
func main() {
homeTmpl, err := template.ParseFiles("./topheader.tmpl", "./footer.tmpl", "./index.tmpl")
if err != nil {
log.Fatal("Home page parsing error:", err)
}
data := Home{Sitelang: "en",
Sitetitle: "Home - Render Test",
Sitename : "test 1",
Siteslogan: "mmmmeeeeeuaawww!"}
homeTmpl.Execute(os.Stdout, data)
}
footer.tmpl:
{{define "footer"}}
<footer>
<small>
This is footer area. Test.</small>
</footer>
</body>
</html>
{{end}}
index.tmpl:
{{template "topheader"}}
<h1>
Main area</h1>
{{template "footer"}}
topheader.tmpl:
{{define "topheader"}}
<!DOCTYPE html>
<html lang="
{{.Sitelang}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
{{.Sitetitle}}</title>
</head>
<body>
<header>
<h1>
{{.Sitename}}
</h1>
<p>
{{.Siteslogan}}
</p>
</header>
{{end}}
构建命令:go build .
我真的不知道我错过了什么。这里有什么问题?
您使用的 template.ParseFiles()
to parse the template files. This will parse all files, and return a template that will "contain" all parsed templates as associated templates. The returned template.Template
将代表 第一个 模板。引用自 template.ParseFiles()
:
The returned template's name will have the (base) name and (parsed) contents of the first file.
然后您使用 Template.Execute()
来执行您正在调用其方法的模板。因此,在您的情况下,这将是 topheader.tmpl
,但该模板不会生成任何输出,该模板只是 定义 一个模板:{{define "topheader"}}
.
您很可能想执行 index.tmpl
,因此请使用 Template.ExecuteTemplate()
,您可以在其中通过名称识别可执行模板(并且不要忘记检查返回的错误):
err = homeTmpl.ExecuteTemplate(os.Stdout, "index.tmpl", data)
if err != nil {
log.Fatal("index template execution failed:", err)
}
另一个错误是,当您的 index.html
模板包含(执行)使用 {{template}}
操作的其他模板时,您没有向它们传递任何参数,但您想使用初始参数.
因此在调用其他模板时传递当前参数。您的 index.html
应该是:
{{template "topheader" .}}
<h1>
Main area</h1>
{{template "footer" .}}
查看相关问题:
我分析了我的模板文件,使我的工作更轻松。
我给它们取名{{define "pagearea"}}
。
例如 {{define "footer"}}
.
文件夹布局
- footer.tmpl - 页脚区域
- index.tmpl - 我的主页
- main.go - 去代码:)
- topheader.tmpl - 顶部的一部分 html
main.go
package main
import (
"log"
"os"
"html/template"
)
type Home struct {
Sitelang string
Sitetitle string
Sitename string
Siteslogan string
}
func main() {
homeTmpl, err := template.ParseFiles("./topheader.tmpl", "./footer.tmpl", "./index.tmpl")
if err != nil {
log.Fatal("Home page parsing error:", err)
}
data := Home{Sitelang: "en",
Sitetitle: "Home - Render Test",
Sitename : "test 1",
Siteslogan: "mmmmeeeeeuaawww!"}
homeTmpl.Execute(os.Stdout, data)
}
footer.tmpl:
{{define "footer"}}
<footer>
<small>
This is footer area. Test.</small>
</footer>
</body>
</html>
{{end}}
index.tmpl:
{{template "topheader"}}
<h1>
Main area</h1>
{{template "footer"}}
topheader.tmpl:
{{define "topheader"}}
<!DOCTYPE html>
<html lang="
{{.Sitelang}}">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>
{{.Sitetitle}}</title>
</head>
<body>
<header>
<h1>
{{.Sitename}}
</h1>
<p>
{{.Siteslogan}}
</p>
</header>
{{end}}
构建命令:go build .
我真的不知道我错过了什么。这里有什么问题?
您使用的 template.ParseFiles()
to parse the template files. This will parse all files, and return a template that will "contain" all parsed templates as associated templates. The returned template.Template
将代表 第一个 模板。引用自 template.ParseFiles()
:
The returned template's name will have the (base) name and (parsed) contents of the first file.
然后您使用 Template.Execute()
来执行您正在调用其方法的模板。因此,在您的情况下,这将是 topheader.tmpl
,但该模板不会生成任何输出,该模板只是 定义 一个模板:{{define "topheader"}}
.
您很可能想执行 index.tmpl
,因此请使用 Template.ExecuteTemplate()
,您可以在其中通过名称识别可执行模板(并且不要忘记检查返回的错误):
err = homeTmpl.ExecuteTemplate(os.Stdout, "index.tmpl", data)
if err != nil {
log.Fatal("index template execution failed:", err)
}
另一个错误是,当您的 index.html
模板包含(执行)使用 {{template}}
操作的其他模板时,您没有向它们传递任何参数,但您想使用初始参数.
因此在调用其他模板时传递当前参数。您的 index.html
应该是:
{{template "topheader" .}}
<h1>
Main area</h1>
{{template "footer" .}}
查看相关问题: