2016-01-11 89 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}}'。它沒有工作。 –