2014-11-24 4 views
3

Использование шаблонов с разделителями прекрасно работает при использовании template.New("...").Delims("[[", "]]").Parse() Однако, я не могу понять, как получить тот же результат с template.ParseFiles()Golang HTML/шаблоны: ParseFiles с обычаем Delims

tmpl, err := template.ParseFiles("base.tmpl", "homepage/inner.tmpl") 
if err != nil { panic(err) } 
tmpl.Delims("[[", "]]") 
p := new(Page) 
err = tmpl.Execute(os.Stdout, p) 
if err != nil { panic(err) } 

У меня нет никаких ошибок, но разделители не изменяются.

tmpl, err := template.ParseFiles("base.tmpl", "homepage/inner.tmpl") 
t := tmpl.Lookup("base.tmpl").Delims("[[", "]]") 
p := new(Page) 
err = t.Execute(os.Stdout, p) 
if err != nil { panic(err) } 

Это приводит к такому же результату.

В случае, если это уместно, мне нужно встроить небольшое угловое приложение на определенную страницу моего сайта.

Кроме того, у меня есть базовый шаблон с общей HTML структуры, которые я объединить с страницы конкретного шаблона с ParseFiles(), что приводит к этой схеме:

/templates/base.tmpl 
/templates/homepage/inner.tmpl 
/templates/otherpage/inner.tmpl 

Возможно ли это вообще? Если да, то что я делаю неправильно?

+1

Похоже, что вы должны иметь возможность делать 'template.New (...). Delims (...). ParseFiles (. ..) 'из [docs] (http://golang.org/pkg/html/template/#Template.ParseFiles). Это второй ParseFiles в индексе, а не первый. – twotwotwo

+1

Действительно! Хотя я работал над этим довольно долгое время, я понял это через несколько минут после публикации вопроса. Мне трудно обернуть голову вокруг этого пакета :) Спасибо за вашу помощь! –

+1

Для будущих читателей еще одна деталь, которой мне не хватало, это то, что мне нужно всегда называть шаблон «base.tmpl» для любой страницы с помощью template.New («base.tmpl»). Я предполагаю, что это потому, что это имя корневого шаблона для использования в наборе шаблонов синтаксического анализа. –

ответ

5

Создать фиктивный шаблон, установите ограничители, а затем разобрать файлы:

tmpl, err := template.New("").Delims("[[", "]]").ParseFiles("base.tmpl", "homepage/inner.tmpl") 

Этот аспект API является изворотливым и не очень очевидна. API имел больше смысла в первые дни, когда пакет шаблонов имел дополнительный тип Set

+1

Примечание для других: пустой аргумент «" для шаблона.New() вызвал панику во время выполнения для меня. Замените template.New ("") на template.New ("some_template_name") – codefreak

+1

Не только то, что сказал @codefreak, но вы также должны вызвать ExecuteTemplate с указанным именем. Вызов только «Выполнение» даст вам панику с разницей в ноль. – THUNDERGROOVE