当前位置: 首页 > 知识库问答 >
问题:

Golang 模板函数是否可以在引用自身时渲染另一个模板?

羊和光
2023-03-14

我想使用一个模板函数扩展默认的Golang模板函数,该模板函数呈现另一个Golang模板,而该模板也应该可以访问相关函数。

下面的演示案例应该创建一个< code>include模板函数,该函数呈现一个给定的模板,该模板也可以包含相同的< code>include函数。然而,这个例子(理所当然地)引发了一个初始化周期错误。

Golang 模板函数是否可以在引用自身时渲染另一个模板?

https://play.golang.org/p/hml-GDhV1HI

package main

import (
    "bytes"
    "errors"
    html_template "html/template"
    "os"
)

var includeFuncs = map[string]interface{}{
    "include": func(templatePath string, data interface{}) (string, error) {
        templatePath = "templates/" + templatePath
        if _, err := os.Stat(templatePath); err != nil {
            return "", errors.New("Unable to find the template file " + templatePath)
        }

        var renderedTpl bytes.Buffer
        tpl, err := html_template.New(templatePath).Funcs(GetHTMLIncludeFuncs()).Parse(templatePath)
        if err != nil {
            return "", err
        }

        if err := tpl.Execute(&renderedTpl, data); err != nil {
            return "", err
        }

        return renderedTpl.String(), nil
    },
}

func GetHTMLIncludeFuncs() html_template.FuncMap {
    return html_template.FuncMap(includeFuncs)
}

共有1个答案

林祯
2023-03-14

使用init()

var includeFuncs = map[string]interface{}{}

func includeFunc(templatePath string, data interface{}) (string, error) {...}

func init() {
   includeFuncs["include"]=includeFunc
}

在原始帖子中,您会陷入初始化循环,因为在执行开始之前,运行时必须初始化所有初始化变量,编译器会检测到初始化循环。

使用上面的解决方案,初始化可以在程序启动之前完成,因为函数映射是空的。在< code>main开始运行之前,< code>init函数运行并使用函数初始化地图。

 类似资料:
  • 6.1 渲染模板 一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。 map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。 它的渲染函数有一个可选的变量键值对map 通过 ctx.Render() 方法来渲染模板,例如: func (r *Render) Serve(ctx *faygo.Context) error { return ctx.Ren

  • Tango默认核心不包含模板渲染功能,在官方中间件中包含两个渲染引擎中间件,一个是 Go标准模板引擎, 另一个是 Pongo2模板引擎

  • 在控制器里模板渲染最常用的方法是display,在CMF中支持如下的模板渲染方式: //不带任何参数 $this->display(); 此种方式系统会自动判断模板路径,并渲染出模板内容,此种方式模板路径是:主题名/应用名/控制器名/操作名+模板文件后缀名; $this->display('edit'); 此种方式表示调用此控制器下的edit操作的模板; $this->display(':in

  • Tpongo2 中间件是 pongo2.v3 模板引擎的 Tango 支持。 安装 go get github.com/tango-contrib/tpongo2 示例 package main import ( "github.com/lunny/tango" "gopkg.in/flosch/pongo2.v3" "github.com/tango-contrib/tp

  • 问题内容: 我正在做一个Flask应用程序。我有一个登录区域,一个博客区域。如果要获取用户的登录名,我将呈现登录模板。但这不会呈现必须显示在登录区域下方的博客模板。 我将尝试使其更加清晰: 现在我有一个扩展它,并进入登录块。我有一个进入。如何同时渲染两者?当我这样做时,我只能在login.html或之一上调用它。 请帮帮我。如果你需要,我会提供更多详细信息。 问题答案: 你可能会以错误的方式考虑布

  •  说明 调用方法: $.f2e.util.render(temp,data,fn,helper); 函数说明: 调用template渲染模板,依赖于artTemplate库 参数说明: 参数名 类型 说明 备注 temp string html字符串 无 data object 参数名 无 fn function 回调函数 无 helper function artTemplate自定义方法 无