为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
富国沪深 2021-07-07 14:01:05
我看不到使用动态名称调用模板(文本或 html)的方法。例子:这有效:{{template "Blah" .}}此错误与“模板调用中出现意外的“$BlahVar””:{{$BlahVar := "Blah"}} {{template $BlahVar .}}我试图解决的总体问题是我需要根据配置文件有条件地呈现模板 - 所以我不知道模板的名称提前。显然我可以在 FuncMap 中放置一个函数,它只执行单独的模板解析和调用并返回该结果,但想知道是否有更好的方法。
查看完整描述

3 回答

?
有只小跳蛙

TA贡献1824条经验 获得超8个赞

作为对此的说明和跟进,我最终得到了这个问题的两个主要答案:1)尽量避免这种情况。在某些情况下,一个简单的 if 语句工作正常。2)我能够使用 FuncMap 中的一个函数来完成这个,它只是一个单独的渲染。这不是世界上最伟大的事情,但它确实有效并解决了问题。这是一个完整的独立演示,展示了这个想法:


package main


import (

    "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)

    }


}


查看完整回答
反对 回复 2021-07-12
  • 3 回答
  • 0 关注
  • 205 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信