在模板之间传递数据
Pass data between templates
我有一个简单的案例,其中一个模板 (text/templates)
包含另一个这样的模板
`index.html`
{{ template "image_row" . }}
`image_row.html`
{{ define "image_row" }}
To stuff here
{{ end }}
现在我想重复使用图像行模板。假设我想传递一个简单的数字,以便 image_row 模板根据这个数字
构建行
我想要类似的东西(其中 5 是附加参数)
index.html
{{ template "image_row" . | 5 }}
在这种情况下我该如何实现?
我不确定是否存在将多个参数传递给模板调用的内置解决方案,但如果没有,您可以定义一个合并其参数和 returns 它们的函数作为单个切片值,然后您可以注册该函数并在模板调用中使用它。
类似于:
func args(vs ...interface{}) []interface{} { return vs }
t, err := template.New("t").Funcs(template.FuncMap{"args":args}).Parse...
然后,在您的 index.html
中,您可以这样做:
{{ template "image_row" args . 5 }}
然后在 image_row
模板中,您可以使用内置 index
函数访问参数,如下所示:
{{ define "image_row" }}
To stuff here {{index . 0}} {{index . 1}}
{{ end }}
没有内置的。您可以添加一个创建地图的函数并在子模板中使用它:
func argsfn(kvs ...interface{}) (map[string]interface{}, error) {
if len(kvs)%2 != 0 {
return nil, errors.New("args requires even number of arguments.")
}
m := make(map[string]interface{})
for i := 0; i < len(kvs); i += 2 {
s, ok := kvs[i].(string)
if !ok {
return nil, errors.New("even args to args must be strings.")
}
m[s] = kvs[i+1]
}
return m, nil
}
像这样将函数添加到模板中:
t := template.Must(template.New("").Funcs(template.FuncMap{"args": argsfn}).Parse(......
这样使用:
{{template "image_row" args "row" . "a" 5}}{{end}}
{{define "image_row"}}
{{$.row}} {{$.a}}
{{end}}
使用地图的好处是参数是"named"。如另一个答案中所述使用切片的优点是代码简单得多。
我有一个简单的案例,其中一个模板 (text/templates)
包含另一个这样的模板
`index.html`
{{ template "image_row" . }}
`image_row.html`
{{ define "image_row" }}
To stuff here
{{ end }}
现在我想重复使用图像行模板。假设我想传递一个简单的数字,以便 image_row 模板根据这个数字
构建行我想要类似的东西(其中 5 是附加参数)
index.html
{{ template "image_row" . | 5 }}
在这种情况下我该如何实现?
我不确定是否存在将多个参数传递给模板调用的内置解决方案,但如果没有,您可以定义一个合并其参数和 returns 它们的函数作为单个切片值,然后您可以注册该函数并在模板调用中使用它。
类似于:
func args(vs ...interface{}) []interface{} { return vs }
t, err := template.New("t").Funcs(template.FuncMap{"args":args}).Parse...
然后,在您的 index.html
中,您可以这样做:
{{ template "image_row" args . 5 }}
然后在 image_row
模板中,您可以使用内置 index
函数访问参数,如下所示:
{{ define "image_row" }}
To stuff here {{index . 0}} {{index . 1}}
{{ end }}
没有内置的。您可以添加一个创建地图的函数并在子模板中使用它:
func argsfn(kvs ...interface{}) (map[string]interface{}, error) {
if len(kvs)%2 != 0 {
return nil, errors.New("args requires even number of arguments.")
}
m := make(map[string]interface{})
for i := 0; i < len(kvs); i += 2 {
s, ok := kvs[i].(string)
if !ok {
return nil, errors.New("even args to args must be strings.")
}
m[s] = kvs[i+1]
}
return m, nil
}
像这样将函数添加到模板中:
t := template.Must(template.New("").Funcs(template.FuncMap{"args": argsfn}).Parse(......
这样使用:
{{template "image_row" args "row" . "a" 5}}{{end}}
{{define "image_row"}}
{{$.row}} {{$.a}}
{{end}}
使用地图的好处是参数是"named"。如另一个答案中所述使用切片的优点是代码简单得多。