beego模板 - 使用地图的键或值作为其他地图的关键字或将其传递给模板函数

时间:2016-09-26 03:36:34

标签: go beego go-templates

我的JSON结构不足。

func getJsonMappings() *string {
    data := `{
        "CategoryGroup": {
            "Category subgrp1": ["type1", "type2"],

        },
        "CategoryGroupDetail" : {
            "type1":{
                "extension":"abc",
                "title" : "this is description",
                "other": "i have some other details apart from above in this map"
                },
            "type2" :{
                "extension":"abc",
                "title" : "this is description",
                "other": "i have some other details apart from above in this map"
                }
        }

        }`
return &data
}

我在JSON之上解组以控制器函数定义

中的golang数据结构如下所示
func (this *MainPageController) Get() {
      jsonData := getJsonMappings()

var catMapObj map[string]interface{}

err := json.Unmarshal([]byte(*jsonData), &catMapObj)
if err != nil {
    panic(err.Error())
}
    this.Data["CategoryGroup"] = catMapObj["CategoryGroup"]
    this.Data["CatAttributeMapping"] = catMapObj["CatAttributeMapping"]
    this.TplName = "index.tpl"
}

并尝试在模板下面渲染。

<ul class="collapsible collapsible-accordion">
    {{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
    <li class="bold"><a class="collapsible-header  waves-effect waves-teal">{{ $eachCategory }}</a>
          <div class="collapsible-body" style="">
            <ul>
            {{ range $_, $subConvertorCategoryId := $subCategoriesList }}
                <li><a id="{{ $subConvertorCategoryId }}" class='doc_cvt' href="#">{{ $subConvertorCategoryId|getCategoryTitle }}</a></li>
            {{ end }}
            </ul>
          </div>
    </li>
    {{ end }}
    </ul>

其中getCategoryTitle是模板函数。但我没有得到类型变量的任何值作为函数参数。我的模板函数定义类似于

func GetCategoryTitle(type string) (title string) {
.....
}

如果我在函数内部将“type”的值硬编码为“type1”,那么一切看起来都不错。但我想在运行时从模板发送值。在同一时刻,我能够将“.CategoryGroup”的值传递给模板函数。

因此我的问题是:

1-如何将解析模板时收到的地图的键或值传递给golang模板函数?

2-如果您仔细查看上面的结构,那么您将发现我不需要编写模板函数。我应该得到像这样的价值 {{.CategoryGroupDetail。$ subConvertorCategoryId.title}}。但我无法这样做。我对django(python框架)做了同样的事情。必须有办法在golang / beego中也这样做。

我是golang和Beego的新手。请指导我如何进一步。

Try1:

<ul class="collapsible collapsible-accordion">
{{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
<li class="bold"><a class="collapsible-header  waves-effect waves-teal">{{ $eachCategory }}</a>
      <div class="collapsible-body" style="">
        <ul>
        {{ range $_, $subConvertorCategoryId := $subCategoriesList }}
        {{ $categoryDetail := index .CatAttributeMapping $subConvertorCategoryId}}
            <li><a id="{{ $subConvertorCategoryId }}" class='doc_cvt' href="#">{{ $categoryDetail.title }}</a></li>
        {{ end }}
        </ul>
      </div>
</li>
{{ end }}

我在运行时遇到错误 -

template: index.tpl:38:32: executing "index.tpl" at <.CatAttributeMapping>: can't evaluate field CatAttributeMapping in type interface {}

1 个答案:

答案 0 :(得分:0)

看起来您正在尝试使用点运算符访问地图的内部。不知道最终结果应该是什么样的,这会让事情变得更加困难。

我认为这个例子可以帮助您找到两个问题:

{{ range $eachCategory, $subCategoriesList := .CategoryGroup }}
<li class="bold"><a class="collapsible-header  waves-effect waves-teal">{{ $eachCategory }}</a>
      <div class="collapsible-body" style="">
        <ul>
        {{ range $key, $val := index .CatAttributeMapping $eachCategory }}
            <li><a id="{{ $key}}" class='doc_cvt' href="#">{{ $val.title }}</a></li>
        {{ end }}
        </ul>
      </div>
</li>
{{ end }}

有关索引命令的更多详细信息,请查看:http://golang.org/pkg/text/template/

关键部分是

  

index返回索引其第一个参数的结果     以下论点。因此,在Go语法中,“index x 1 2 3”是     X 1 [2] [3]。每个索引项必须是地图,切片或数组。

Beego在大多数情况下只使用golang基本模板系统。

编辑1:你问一个复合问题,所以事情变得有点棘手。要弄清楚的第一件事是你是否正确地将数据解析为结构。如果你没有这样做,将把它传递给一个界面,让你弄清楚如何处理。从你的代码看起来你正在处理这种情况。

所以一次只考虑一个问题。 this is a great Q&A that covers parsing nested structures in go

如果您仍然遇到问题,我建议您使用不同的标签重新提交您的问题。在验证结构已正确设置后,将一个提交给golang json尝试使解析正确,并提交一个golang模板。
首先将数据放入结构中,然后使其与模板一起使用。对不起,我没有适合你的复制粘贴解决方案,但我现在有点忙。

我会尽我所能回到这个问题,因为我不认为你是孤身一人。使用JSON解析器处理嵌套结构并处理模板引擎可能很困难。我们需要创建更多如何做事的例子!