31

当我尝试使用FuncsFuncMap. 以下代码按预期工作:

buffer := bytes.NewBufferString("")

funcMap := template.FuncMap{
    "label": strings.Title,
}

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "")

return string(buffer.Bytes()) //=> "Alex"

但是当我尝试将模板放入文件时,它不起作用(Execute()说:)"alex" is an incomplete or empty template

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

使用模板.html:

{{label \"alex\"}}

知道为什么吗?这是一个错误吗?有没有更简单的方法在模板中使用方法/函数?

4

3 回答 3

34

ParseFiles 可能会使用更好的文档。一个模板对象中可以有多个模板,每个模板都有一个名称。如果您查看 ParseFiles 的实现,您会发现它使用文件名作为模板对象内部的模板名称。因此,将您的文件命名为与模板对象相同的名称(可能通常不实用),或者使用 ExecuteTemplate 而不是 Execute。

于 2012-04-17T22:31:37.037 回答
16

索尼娅的回答在技术上是正确的,但让我更加困惑。以下是我最终让它工作的方式:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html")
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
    return
}
err = t.Execute(w, data)
if err != nil {
    fmt.Fprint(w, "Error:", err)
    fmt.Println("Error:", err)
}

模板的名称是模板的裸文件名,而不是完整的路径。Execute将执行默认模板,只要它被命名为匹配,所以不需要使用ExecuteTemplate.

在这种情况下,_base.html文件是最外层的容器,例如:

<!DOCTYPE html>
<html><body>
<h1>{{ template "title" }}</h1>
{{ template "content" }}
</body></html>

whilehome.html定义了具体的部分:

{{ define "title" }}Home{{ end }}

{{ define "content" }}
Stuff
{{ end }}
于 2014-01-01T20:08:03.323 回答
0

您需要首先解析所有文件并执行它们。您不能直接访问所有文件。

于 2020-02-17T06:13:04.457 回答