Функция шаблона Go
он заметил странную вещь с шаблонами Go, когда я пытаюсь использовать Funcs
и FuncMap
. Следующий код работает так, как ожидалось:
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"}}
есть идеи почему ? Это жук ? Существуют ли более простые способы использования методов / функций в шаблонах ?
2 ответов
ParseFiles, вероятно, может использовать лучшую документацию. Объект шаблона может иметь несколько шаблонов, и каждый из них имеет имя. Если вы посмотрите на реализацию ParseFiles, вы увидите, что она использует имя файла как имя шаблона внутри объекта шаблона. Итак, назовите свой файл так же, как объект шаблона (возможно, не совсем практично), или используйте ExecuteTemplate вместо просто Execute.
ответ Сони технически правильный, но оставил меня еще более смущенным. Вот как я в конечном итоге получил его работу:
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>
пока home.html
определяет конкретные части:
{{ define "title" }}Home{{ end }}
{{ define "content" }}
Stuff
{{ end }}