模板中的 Golang 模板全局点,其值来自范围
Golang template global dot within a template that's given a value from range
我的设置:
base.tmpl
{{define "base"}} ...basic hmtl boilerplate ...{{end}}
{{define "post"}}
{{.ID}} {{.Username}} etc...
{{if $.User.Admin}}
<...admin controls...>
{{end}}
{{end}}
index.tmpl
{{template "base" . }}
{{define "content"}}
Stuff......
{{range .Posts }}
{{template "post" . }}
{{end}}
{{end}}
但我明白了
$.User.Admin is not a field of db.Post
如何从未提供的模板中的 "global" 点值中获取值? $。显然是行不通的。
我只是让 post 在范围内,但我添加了一个新页面来查看个人 post,并且不想更新 post 所在的每个区域单独显示。
更新:模板是这样执行的
func Index(rw http.ResponseWriter, req *http.Request) {
g := GetGlobal(rw, req) // Gets logged in user info, adds branch/version info etc
... Get posts from the DB ...
if err := Templates["index.tmpl"].Execute(rw, g); err != nil {
Log.Println("Error executing template", err.Error())
}
}
全局结构如下所示:
type Global struct {
User db.User
Users []db.User
EditUser db.User
Session *sessions.Session
Error error
Posts []db.Post
Post db.Post
DoRecaptcha bool
Host string
Version string
Branch string
}
模板加载如下:
Templates[filename] = template.Must(template.ParseFiles("templates/"+filename, "templates/base.tmpl"))
调用模板创建新范围:
A template invocation does not inherit variables from the point of its invocation.
所以你有三个选择:
- 在 post 中添加对父项的引用(正如您在上一条评论中所说的那样)
创建一个通过闭包引用变量的函数(isAdmin
):
template.New("test").Funcs(map[string]interface{}{
"isAdmin": func() bool {
return true // you can get it here
},
}).Parse(src)
这种方法的缺点是每次都必须解析模板。
创建一个新函数,该函数可以构造一个 post,它具有对父级的引用,而无需修改原始数据。例如:
template.New("test").Funcs(map[string]interface{}{
"pair": func(x, y interface{}) interface{} {
return struct { First, Second interface{} } { x, y }
},
}).Parse(src)
你可以这样使用它:
{{range .Posts }}
{{template "post" pair $ . }}
{{end}}
另一种选择是制作一个dict
函数:Calling a template with several pipeline parameters
我的设置:
base.tmpl
{{define "base"}} ...basic hmtl boilerplate ...{{end}}
{{define "post"}}
{{.ID}} {{.Username}} etc...
{{if $.User.Admin}}
<...admin controls...>
{{end}}
{{end}}
index.tmpl
{{template "base" . }}
{{define "content"}}
Stuff......
{{range .Posts }}
{{template "post" . }}
{{end}}
{{end}}
但我明白了
$.User.Admin is not a field of db.Post
如何从未提供的模板中的 "global" 点值中获取值? $。显然是行不通的。
我只是让 post 在范围内,但我添加了一个新页面来查看个人 post,并且不想更新 post 所在的每个区域单独显示。
更新:模板是这样执行的
func Index(rw http.ResponseWriter, req *http.Request) {
g := GetGlobal(rw, req) // Gets logged in user info, adds branch/version info etc
... Get posts from the DB ...
if err := Templates["index.tmpl"].Execute(rw, g); err != nil {
Log.Println("Error executing template", err.Error())
}
}
全局结构如下所示:
type Global struct {
User db.User
Users []db.User
EditUser db.User
Session *sessions.Session
Error error
Posts []db.Post
Post db.Post
DoRecaptcha bool
Host string
Version string
Branch string
}
模板加载如下:
Templates[filename] = template.Must(template.ParseFiles("templates/"+filename, "templates/base.tmpl"))
调用模板创建新范围:
A template invocation does not inherit variables from the point of its invocation.
所以你有三个选择:
- 在 post 中添加对父项的引用(正如您在上一条评论中所说的那样)
创建一个通过闭包引用变量的函数(
isAdmin
):template.New("test").Funcs(map[string]interface{}{ "isAdmin": func() bool { return true // you can get it here }, }).Parse(src)
这种方法的缺点是每次都必须解析模板。
创建一个新函数,该函数可以构造一个 post,它具有对父级的引用,而无需修改原始数据。例如:
template.New("test").Funcs(map[string]interface{}{ "pair": func(x, y interface{}) interface{} { return struct { First, Second interface{} } { x, y } }, }).Parse(src)
你可以这样使用它:
{{range .Posts }} {{template "post" pair $ . }} {{end}}
另一种选择是制作一个
dict
函数:Calling a template with several pipeline parameters