【问题标题】:Custom function is not working in template自定义功能在模板中不起作用
【发布时间】:2021-12-22 10:05:20
【问题描述】:

我有以下工作正常playground

package main

import (
    "html/template"
    "os"
)

func main() {
    tmpl := `
{{ $slice := mkSlice "a" 5 "b" }}
{{ range $slice }}
     {{ . }}
{{ end }}
`
    funcMap := map[string]interface{}{"mkSlice": mkSlice}
    t := template.New("").Funcs(template.FuncMap(funcMap))
    template.Must(t.Parse(tmpl))
    t.Execute(os.Stdout, nil)
}

func mkSlice(args ...interface{}) []interface{} {
    return args
}

但是一旦我尝试从模板文件中运行,什么都没有显示,也没有收到任何错误!

func mkSlice(args ...interface{}) []interface{} { // to ceate the array in the template
    return args
}

funcMap := map[string]interface{}{"mkSlice": mkSlice}
tmpl := template.New("").Funcs(template.FuncMap(funcMap))
template.Must(tmpl.ParseFiles("index.html"))
tmpl.Execute(w, nil)

index.html 是:

{{ $slice := mkSlice "a" 5 "b" }}
{{ range $slice }}
    <span> {{ . }} </span>
{{ end }}

有什么想法吗?

【问题讨论】:

    标签: go go-templates


    【解决方案1】:

    您没有看到任何错误,因为您没有检查tmpl.Execute(w, nil) 返回的错误。什么时候检查:

    if err := t.Execute(os.Stdout, nil); err != nil {
        panic(err)
    }
    

    你会看到如下输出:

    panic: template: "" is an incomplete or empty template
    

    不同之处在于,在第一种情况下,您使用了Template.Parse() 方法:

    ... 将文本解析为 t 的模板正文。

    请注意,您解析的模板文本将用于t 本身!

    在第二种情况下,您使用了Template.ParseFiles()

    ... 解析命名文件并将生成的模板与 t 相关联。如果发生错误,则停止解析,返回的模板为 nil;否则为 t。必须至少有一个文件。 由于 ParseFiles 创建的模板以参数文件的基本名称命名,因此 t 通常应该具有文件的(基本)名称之一的名称。

    因此,在您的第一个示例中,t 包含一个模板,该模板将由 Template.Execute() 执行。

    在您的第二个示例中,t 包含多个关联模板,t 本身是一个空模板,另一个关联模板名为 index.html。您可以使用Template.ExecuteTemplate() 执行该模板:

    if err := t.ExecuteTemplate(os.Stdout, "index.html", nil); err != nil {
        panic(err)
    }
    

    有关详细信息,请参阅:

    Go template name

    The Go Template ParseFiles func parsing multiple files

    【讨论】:

    • 谢谢,它正在工作。但显示在text 而不是html,知道吗?
    • 您的意思是显示为文本而不是 HTML?输出不是 HTML 文档。
    • 我的最终声明为tmpl.ExecuteTemplate(w, "index.html", data),它应该呈现为 HTML,在尝试添加它正确呈现为 HTML 的函数之前,我遇到了十个问题,现在它显示在浏览器作为字符串
    • @HasanAYousef 您在问题中显示的模板不是 HTML 文档,所以我不明白为什么它应该呈现为 HTML。如果您有不同的模板,请出示。此外,如果您的输出是 HTML,请使用 html/template 而不是 text/template
    • 忘记了我用它来显示问题的文本模板,让我们谈谈index.html,虽然我使用的是html/template,但它显示为text,知道在使用该功能之前它被正确呈现为 html
    猜你喜欢
    • 2018-04-04
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    相关资源
    最近更新 更多