Шаблон индекса Голанга в том числе

У меня есть два шаблона в моем проекте, например, так:

var indextemplate = template.Must(template.New("").Parse(`<!DOCTYPE html>
<form action="/compare" method="post">
<input type="date" name="from" required>
<input type="submit">
</form>`))

var comparetemplate = template.Must(template.New("").Parse("Hours since {{.From}} are {{.Duration}}"))

Я не понимаю, как структурировать код, поэтому у меня есть шаблон HTML (с головой и </html> в конце) и просто включите эти шаблоны в тело.

Я также не совсем понимаю, как лучше структурировать код так, чтобы шаблон соответствовал обработчику. Начиная с IIUC вам лучше всего скомпилировать шаблон вне обработчика.

1 ответ

Решение

То, что вы должны знать, это то, что значение template.Template может быть набором из нескольких шаблонов, см. его Template.Templates() метод, который возвращает эту коллекцию.

Каждый шаблон в коллекции имеет уникальное имя, на которое он может ссылаться (см. Template.Name()). И есть {{template "name" pipeline}} действие, и с его помощью вы можете включить другие шаблоны в шаблон, еще один шаблон, который является частью коллекции.

Смотрите этот пример. Давайте определим 2 шаблона:

const tmain = `<html><body>
Some body. Now include the other template:
{{template "content" .}}
</body></html>
`
const tcontent = `I'M THE CONTENT, param passed is: {{.Param}}`

Как вы видете, tmain включает в себя еще один шаблон с именем "content", Вы можете использовать Template.New()метод (подчеркиваю: метод, не путать с функцией template.New()) создать новый связанный именованный шаблон, который будет частью шаблона, метод которого вы вызываете. В результате они могут ссылаться друг на друга, например, они могут включать друг друга.

Давайте посмотрим код, который разбирает эти 2 шаблона в один template.Template поэтому они могут ссылаться друг на друга (проверка ошибок для краткости опущена):

t := template.Must(template.New("main").Parse(tmain))
t.New("content").Parse(tcontent)

param := struct{ Param string }{"paramvalue"}

if err := t.ExecuteTemplate(os.Stdout, "main", param); err != nil {
    fmt.Println(err)
}

Вывод (попробуйте на Go Playground):

<html><body>
Some body. Now include the other template:
I'M THE CONTENT, param passed is: paramvalue
</body></html>

альтернатива

Также обратите внимание, что если у вас есть много и больше шаблонов, это становится менее читабельным и обслуживаемым. Вы должны рассмотреть вопрос о сохранении ваших шаблонов в виде файлов, и вы можете использовать template.ParseFiles() а также template.ParseGlob() оба могут одновременно анализировать несколько файлов и формировать из них коллекцию шаблонов, чтобы они могли ссылаться друг на друга. Имена шаблонов будут именами файлов.

Другие вопросы по тегам