去html模板访问范围内的结构域

时间:2016-01-11 05:21:51

标签: html templates go

鉴于以下结构,我想在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
}

1 个答案:

答案 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}}