2013-09-22 4 views
2

Предположим, что у меня есть буксирные текстовые файлы (идут шаблоны):Определение шаблона го верхнего уровня

child.tmpl

TEXT1 
Hello {{ . }} 

top.tmpl

TEXT2 
{{ template "child.tmpl" "argument"}} 

в child.tmpl template размещается в top.tmpl

Типичная программа для анализа их будет:

package main 

import (
    "os" 
    "text/template" 
) 

func main() { 
    t := template.Must(template.ParseFiles("child.tmpl", "top.tmpl") 
    t.ExecuteTemplate(os.Stdout, "top.tmpl", nil) 
} 

Есть ли метод передать шаблон для встраивания в шаблоне верхнего уровня в качестве аргумента, используя {{ . }} обозначения? что-то вроде {{ template {{.}} "argument" }}

  • более общего плана, что это лучший способ, чтобы определить шаблон макета, так что я могу использовать его как шаблон верхнего уровня для нескольких шаблонов детей?

ответ

2

Есть два способа принятые для решения вашей проблемы:

Первый включает в себя написание собственных функций шаблонов включения и регистрации его в качестве template.FuncMap с шаблоном через template.Funcs.

Другой способ заключается в использовании {{define xxx}} блоков в вашем шаблонов. Тогда вы могли бы иметь два файла, которые определяют один и тот же шаблон:

  • file1.html: {{define body}}...{{end}}
  • file2.html: {{define body}}...{{end}}

Разбирает правильный файл в зависимости от ваших потребностей и вашего материя шаблон только сделать {{template body "argument"}}.

На мой взгляд, первый вариант более гибкий.

+0

Крысы. Я надеялся на то же самое. Следующий kludge не работал: {{with $ x: = .BodyPage}} {{template $ x .Content}} {{end}} Поскольку я предварительно скомбинировал шаблоны при запуске программы, я закончил создавая 'map [string] * template.Template', который также не идеален. Я исследую метод пользовательских функций, хотя, как я думаю об этом, он будет ** либо ** в конечном итоге загружать файлы с диска во время выполнения и разбора, либо в итоге получится карта предварительно скомпилированных шаблонов. – Colselaw

Смежные вопросы