鉴于以下结构,我想在html中迭代field2
数据时访问field1
。我该怎么做?
var MyPageData struct {
field1 []Foo
field2 map[string]Bar
}
我试过:内部处理程序功能:
err := myPageTemplate.Execute(w,MyPageData{ field1: field1Slice, field2 : myMapData})
模板:
{{ range $index, $fooInstance := .field1}}
<tr>
<td>{{$fooInstance.Name}}</td> //This prints the Name value
<td>{{ index .$field2 "myKey".Name }}</td>
如何访问上面的field2
并指定检索Bar
实例的键值?
更新添加Foo和Bar结构
type Foo2 struct {
Name string
Id int
}
type Foo struct {
Name string
element Foo2
}
type Bar struct {
Name string
}
答案 0 :(得分:2)
无论管道的值是什么(由模板中的点.
表示),您都可以使用$
来引用传递给{{3的数据值}}。 {{range}}
操作会迭代元素,并将管道(.
)设置为当前项,因此.
始终表示当前项,$
绝对指的是&#34;顶级&#34;数据传递给Template.Execute()
。
Template.Execute()
中记录了这一点:
执行开始时,$设置为传递给Execute的数据参数,即dot的起始值。
另请注意,您必须导出结构字段才能在模板中使用。因此,请将MyPageData
类型更改为:
type MyPageData struct {
Field1 []Foo
Field2 map[string]Bar
}
另请注意,您只需使用.
运算符即可访问地图元素。因此,您也可以在Field2
操作中访问与"myKey"
键相关联的{{range}}
地图的值:
{{$.Field2.myKey}}
见这个简单的例子:
type MyPageData struct {
Field1 []Foo
Field2 map[string]Bar
}
type Foo struct {
Name string
}
type Bar struct {
Name string
}
func main() {
t := template.Must(template.New("").Parse(templ))
mpd := MyPageData{
Field1: []Foo{{"First"}, {"Second"}},
Field2: map[string]Bar{"myKey": {"MyValue"}},
}
t.Execute(os.Stdout, mpd)
}
const templ = `{{range $idx, $foo := .Field1}}{{$.Field2.myKey}} {{$idx}} - {{$foo.Name}}
{{end}}`
输出(在text/template
上尝试):
{MyValue} 0 - First
{MyValue} 1 - Second
另请注意,{{range}}
代替$foo.Name
,您只需使用{{.Name}}
,因为点.
表示$foo
,即当前项目。
如果您想使用动态密钥从Field2
查找值,则需要使用{{index}}
操作。例如,如果您希望与键关联的值为$foo.Name
:
{{index $.Field2 $foo.Name}}
或简短:
{{index $.Field2 .Name}}
接下来,如果与键相关联的值是一个结构,例如,你只需要这个结构的一个字段,让我们说Id
,你可以使用括号:
{{(index $.Field2 .Name).Id}}