猿问

使用动态名称调用其他模板

我看不到使用动态名称调用模板(文本或 html)的方法。例子:

这有效:

{{template "Blah" .}}

此错误与“模板调用中出现意外的“$BlahVar””:

{{$BlahVar := "Blah"}}
{{template $BlahVar .}}

我试图解决的总体问题是我需要根据配置文件有条件地呈现模板 - 所以我不知道模板的名称提前。显然我可以在 FuncMap 中放置一个函数,它只执行单独的模板解析和调用并返回该结果,但想知道是否有更好的方法。


富国沪深
浏览 206回答 3
3回答

有只小跳蛙

作为对此的说明和跟进,我最终得到了这个问题的两个主要答案:1)尽量避免这种情况。在某些情况下,一个简单的 if 语句工作正常。2)我能够使用 FuncMap 中的一个函数来完成这个,它只是一个单独的渲染。这不是世界上最伟大的事情,但它确实有效并解决了问题。这是一个完整的独立演示,展示了这个想法:package mainimport (    "bytes"    "html/template"    "os")func main() {    var err error    // our main template here calls a sub template    tpl := template.New("main")    // provide a func in the FuncMap which can access tpl to be able to look up templates    tpl.Funcs(map[string]interface{}{        "CallTemplate": func(name string, data interface{}) (ret template.HTML, err error) {            buf := bytes.NewBuffer([]byte{})            err = tpl.ExecuteTemplate(buf, name, data)            ret = template.HTML(buf.String())            return        },    })    // this is the main template    _, err = tpl.Parse(`{{$Name := "examplesubtpl"}}from main template{{CallTemplate $Name .}}`)    if err != nil {        panic(err)    }    // whatever code to dynamically figure out what templates to load    // a stub just to demonstrate    _, err = tpl.New("examplesubtpl").Parse(`this is from examplesubtpl - see, it worked!`)    if err != nil {        panic(err)    }    err = tpl.Execute(os.Stdout, map[string]interface{}{})    if err != nil {        panic(err)    }}
随时随地看视频慕课网APP

相关分类

Go
我要回答