2016-01-11 41 views
2

由于下面的结构,我想访问field2,同时迭代在HTML中的field1数据。我该怎么做呢?去html模板访问范围内的结构体字段

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实例?

UPDATE添加Foo和Bar结构

type Foo2 struct { 
    Name string 
    Id int 
} 


type Foo struct { 
    Name string 
    element Foo2 
} 

type Bar struct { 
    Name string 
} 

回答

2

无论管道的价值是什么(这是由点.在模板表示),您可以使用$指您传递给Template.Execute()的数据值。 {{range}}动作遍历元素并将管道(.)设置为当前项目,因此.总是表示当前项目,$绝对是指传递给Template.Execute()的“顶级”数据。

这是记录在text/template

当执行开始,$设置为传递到执行中的数据参数,也就是对点的初始值。

另请注意,您必须导出结构字段才能在模板中使用。因此,改变你的MyPageData类型:

type MyPageData struct { 
    Field1 []Foo 
    Field2 map[string]Bar 
} 

另外请注意,您可以使用.操作员只需访问地图元素。所以,你可以访问这样的"myKey"键关联的Field2地图的价值,在{{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}}` 

输出(尝试在Go Playground ):

{MyValue} 0 - First 
{MyValue} 1 - Second 

还要注意的是insdie的{{range}}而不是$foo.Name可以简单地使用{{.Name}}作为点.表示$foo,即当前项目。

如果要使用动态密钥从Field2查找值,则需要使用{{index}}操作。例如,如果你想用键为$foo.Name关联的值:

{{index $.Field2 $foo.Name}} 

或短:

{{index $.Field2 .Name}} 

,还是今后,如果与键关联的值是例如一个结构,而你只需要这个结构的字段,假设Id,可以使用括号:

{{(index $.Field2 .Name).Id}} 
+0

感谢您的回复。我用样本结构更新了这个问题。 'myKey'是'$ foo.Name'。我试过{{$ .Field2.foo.Name}}但它没有奏效。 –

+0

@sumanj然后你需要使用'{{index}}'动作,例如:'{{index $ .Field2 .Name}}'。见编辑的答案。 – icza

+0

太棒了。但是如果'{{index $ .Field2 .Name}}'是Foo2类型的。我需要打印Foo2元素的Id。我试过'{{index $ .Field2 .Name .Id}}'。它没有工作。 –