如何访问模板中的结构字段

时间:2018-03-12 07:47:16

标签: go go-templates

我想在范围循环中比较字符串类型的两个变量,如下所示:

<select name="category" id="category">            
    {{range $c := .cats}}
      <option value="{{$c.Title}}"  {{ if eq $c.Title .category}}active{{end}}>{{$c.Title}}</option>                                       
    {{end}}    
</select>

$c.Titlecategory都是控制器调度的字符串。

然而,相反,在渲染模板中的下拉菜单中,我得到:

  

无法评估类型model.category

中的字段类别

$c属于结构类型类别:

type Category struct {
    ID        int       `db:"id"`
    Title     string    `db:"title"`
    Slug      string    `db:"slug"`
    CreatedAt time.Time `db:"created_at"`
}

当我在上面的代码中直接输入category而不是.category的字符串值时,没有问题。
我使用gowebapp MVC框架,如果它确实重要。

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:7)

您要与之比较的.category值不属于model,但模板引擎会尝试解析.category,因为category是一个字段或方法您的model值。

这是因为{{range}}操作将点.设置为每次迭代中的连续元素。

要引用顶级category,您可以使用$这样的符号:

<select name="category" id="category">            
    {{range $c := .cats}}
      <option value="{{$c.Title}}"  {{ if eq $c.Title $.category}}active{{end}}>{{$c.Title}}</option>                                       
    {{end}}    
</select>

请参阅此可运行示例:

func main() {
    t := template.Must(template.New("").Parse(src))
    params := map[string]interface{}{
        "category": "Cars",
        "cats": []struct{ Title string }{
            {"Animals"}, {"Cars"}, {"Houses"},
        },
    }
    if err := t.Execute(os.Stdout, params); err != nil {
        panic(err)
    }
}

const src = `<select name="category" id="category">            
    {{range $c := .cats}}
      <option value="{{$c.Title}}"  {{ if eq $c.Title $.category}}active{{end}}>{{$c.Title}}</option>                                       
    {{end}}    
</select>`

输出(在Go Playground上尝试):

<select name="category" id="category">            

      <option value="Animals"  >Animals</option>

      <option value="Cars"  active>Cars</option>

      <option value="Houses"  >Houses</option>

</select>