为什么传递的变量不显示在html / template中?

时间:2019-11-27 16:09:44

标签: go google-cloud-firestore slice go-templates go-html-template

我不知道为什么传递的变量没有用html / template渲染

这是在浏览器中呈现的内容:

这是所有传递的变量:[0xc0000a8ec0 0xc0000a8f80 0xc0000a9040 0xc0000a9100]

城市人口国家首都

这是日志:
$运行main.go

2019/11/27 11:00:39 **** => &city has &main.City{Name:"Washington D.C.", State:"", Country:"USA", Capital:false, Population:680000} before appending to cities ****
2019/11/27 11:00:39 **** => &city has &main.City{Name:"Los Angeles", State:"CA", Country:"USA", Capital:false, Population:3900000} before appending to cities ****
2019/11/27 11:00:39 **** => &city has &main.City{Name:"San Francisco", State:"CA", Country:"USA", Capital:false, Population:860000} before appending to cities ****
2019/11/27 11:00:39 **** => &city has &main.City{Name:"Tokyo", State:"", Country:"Japan", Capital:true, Population:9000000} before appending to cities ****
**** => cities outside {} has 4

以下是处理函数:

func indexHandler(w http.ResponseWriter, r *http.Request) {
    projectID := "XXXXXXXXXXXXXX"
    ctx := context.Background()

    client, _ := firestore.NewClient(ctx, projectID)

    query := client.Collection("cities").Documents(ctx)
    defer query.Stop()
    cities := make([]*City, 0)
    for {
        doc, err := query.Next()
        if err == iterator.Done {
            break
        }
        c := doc.Data()

        // is there an easier way to populate the city struct
        city := City{
            Name:       c["name"].(string),
            Country:    c["country"].(string),
            Population: c["population"].(int64),
        }
        // This is my ugly solution to dealing with nil value from Firestore
        _, ok := c["capital"]
        if ok {
            city.Capital = c["capital"].(bool)
        }
        state, ok := c["state"].(string)
        if ok {
            city.State = state
        }
        log.Printf("**** => &city has %#v before appending to cities ****", &city)
        cities = append(cities, &city)

    }

    fmt.Printf("**** => cities outside {} has %d", len(cities))
    indexTemplate.Execute(w, cities)    
}

这是index.html模板:
    

{% autoescape true %}

<html lang="en">
<head>
<meta name="viewport" content="width=device-width, initial-scale=1">

</head>
<body>
        <P>This is all the passed variables: {{ . }}</P>
    <table>
        <tr>  <td>City</td> <td>Population</td> <td> State</td><td>Country</td> <td>Capital</td> </tr>

    {{ range .cities }}
    <tr>  <td>testing</td> <td>testing</td> <td>testing</td><td>testing</td> <td>testing</td> </tr>
    <tr>  <td>{{.Name}}</td> <td>{{ .Population}}</td> <td>{{ .State}}</td><td>{{.Country}}</td> <td>{{.Capital}}</td> </tr>
    {{ end }}


</table>
{{ $cities := . }}

</body>
</html>
{% endautoescape %}

1 个答案:

答案 0 :(得分:6)

请不要忽略任何错误,请检查indexTemplate.Execute(w, cities)返回什么。它可能揭示了原因:

您传递cities作为数据,它是一个切片。没有cities字段或方法。传递的数据成为,因此您必须在点上移动。

代替:

{{ range .cities }}

使用:

{{ range . }}