如何将多个值从模板传递到模板?
Posted
技术标签:
【中文标题】如何将多个值从模板传递到模板?【英文标题】:How to pass multiple values from template to template? 【发布时间】:2018-09-03 12:28:43 【问题描述】:我的City
结构是这样的:
type City struct
ID int
Name string
Regions []Region
而Region
结构是:
type Region struct
ID int
Name string
Shops []Destination
Masters []Master
EducationCenters []Destination
我主要尝试这样做:
tpl.ExecuteTemplate(resWriter,"cities.gohtml",CityWithSomeData)
是否可以在模板中执行类似的操作?
range .
$city:=.Name
range .Regions
$region:=.Name
template "data" .Shops $city $region
end
end
【问题讨论】:
***.com/questions/18276173/…的可能重复 【参考方案1】:我猜CityWithSomeData
是一个切片,如果是这样尝试一下:
type viewModel struct
List []City
然后,在您的模板中:
range .List
$city:=.Name
range .Regions
$region:=.Name
template "data" .Shops $city $region
end
end
【讨论】:
City 是如上所示的结构。我想知道如何在data
模板中访问这些$city
和$region
变量【参考方案2】:
引用text/template
的文档,template
操作的语法:
template "name"
The template with the specified name is executed with nil data.
template "name" pipeline
The template with the specified name is executed with dot set
to the value of the pipeline.
这意味着您可以将一个可选数据传递给模板执行,而不是更多。如果要传递多个值,则必须将它们包装成您传递的某个值。详情见How to pass multiple data to Go template?
所以我们应该将这些数据包装到结构或映射中。但是我们不能在模板中编写 Go 代码。我们可以做的是注册一个函数,我们将这些数据传递给该函数,该函数可以进行“打包”并返回一个值,现在我们可以将其传递给template
操作。
这是一个示例包装器,它简单地将这些包装到地图中:
func Wrap(shops []Destination, cityName, regionName string) map[string]interface
return map[string]interface
"Shops": shops,
"CityName": cityName,
"RegionName": regionName,
可以使用Template.Funcs()
方法注册自定义函数,别忘了在解析模板文本之前必须这样做。
这是一个修改过的模板,它调用这个Wrap()
函数来产生一个值:
const src = `
define "data"
City: .CityName, Region: .RegionName, Shops: .Shops
end
- range . -
$city:=.Name
- range .Regions -
$region:=.Name
- template "data" (Wrap .Shops $city $region) -
end
- end`
下面是一个可运行的示例,展示了这些操作:
t := template.Must(template.New("cities.gohtml").Funcs(template.FuncMap
"Wrap": Wrap,
).Parse(src))
CityWithSomeData := []City
Name: "CityA",
Regions: []Region
Name: "CA-RA", Shops: []Destination"CA-RA-SA", "CA-RA-SB",
Name: "CA-RB", Shops: []Destination"CA-RB-SA", "CA-RB-SB",
,
,
Name: "CityB",
Regions: []Region
Name: "CB-RA", Shops: []Destination"CB-RA-SA", "CB-RA-SB",
Name: "CB-RB", Shops: []Destination"CB-RB-SA", "CB-RB-SB",
,
,
if err := t.ExecuteTemplate(os.Stdout, "cities.gohtml", CityWithSomeData); err != nil
panic(err)
输出(在Go Playground 上试试):
City: CityA, Region: CA-RA, Shops: [CA-RA-SA CA-RA-SB]
City: CityA, Region: CA-RB, Shops: [CA-RB-SA CA-RB-SB]
City: CityB, Region: CB-RA, Shops: [CB-RA-SA CB-RA-SB]
City: CityB, Region: CB-RB, Shops: [CB-RB-SA CB-RB-SB]
【讨论】:
这是我所期望的。谢谢以上是关于如何将多个值从模板传递到模板?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 observable 的值从服务传递到组件以更新模板
如何将值从 django 模板化 html 传递到 ajax