Как выполнить несколько шаблонов на одной веб-странице, используя разные интерфейсы в golang?
Пожалуйста, прости меня за странный вопрос. Я не был уверен, как именно изложить свою проблему в одном утверждении.
У меня есть три шаблона в моей веб-странице, заголовок, макет и нижний колонтитул.
В заголовке шаблона у меня есть выпадающее меню категорий, и у меня есть фрагмент строк с элементами подменю в моем коде go.
Categories := []string{"Holiday","IQ","Future"}
и заголовок шаблона имеет следующий HTML-код
<div class="ui dropdown item">
<i class="browser icon"></i>
Categories
<i class="dropdown icon"></i>
<div class="menu">
{{range $i,$e:= .}}
<a class="item"><i class="hashtag icon"></i>{{$e}}</a>
{{end}}
</div>
</div>
поэтому, когда я делаю,
t,err :=template.ParseFiles("template/header.html","template/index.html","template/footer.html")
t.ExecuteTemplate(w,"header",Categories)
Это дает мне красивый заголовок, но мне нужно сделать
t.ExecuteTemplate(w,"layout",Featured)
для главной страницы. Шаблон макета имеет следующую структуру
some html code
{{template "header"}}
more html code
{{template "footer"}}
Очевидно, что использование обоих операторов шаблона execute дает два разных заголовка.
Если я удалю заголовок шаблона из макета шаблона, визуальный вывод будет идеальным, но когда вы посмотрите на HTML-код, строка меню будет выше операторов "link rel" (помните, у меня был "некоторый HTML-код" выше {{template "). заголовок "}} в шаблоне макета), и это, очевидно, не хорошо.
Что я должен сделать, чтобы оба шаблона выполнялись одновременно с использованием их соответствующих структур?
2 ответа
Я решил отредактировать свой шаблон заголовка, чтобы включить все, что находится над ним, и соответственно изменил свой код go. У меня на самом деле были ссылки на CSS и скрипты над ним. Так как он должен был быть различным для каждой страницы, я включил только nav_bar в заголовок, но я решил исправить эту проблему.
Я сделал новую структуру
type Header struct{
Css []string;
Title string;
Js []string;
Categories []string;
}
и это часть моего шаблона заголовка
{{range $i,$e:=.Css}}
<link rel="stylesheet" type="text/css" href="{{$e}}">
{{end}}
{{range $i,$e:=.Js}}
<script src="{{$e}}"></script>
{{end}}
Я выполнил часть шаблона execute с заголовком сначала с соответствующим интерфейсом заголовка, а затем другой шаблон execute с соответствующим интерфейсом. Также мне пришлось удалить часть {{template "header"}} из index.html. Результат выглядит отлично и работает так, как я хочу.
У меня была аналогичная проблема. Одним из очевидных решений является просто объединение текста в один шаблон. Прежде чем я пытался разобрать> выполнить> разобрать> выполнить... это не сработало, как ожидалось. Это проще:
t, err := template.New("moo").Parse(header + content + footer)
t.Execute(w, data)
По крайней мере, сейчас я объединяю все свои данные в одну структуру «данных».