Как выполнить несколько шаблонов на одной веб-странице, используя разные интерфейсы в 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)

По крайней мере, сейчас я объединяю все свои данные в одну структуру «данных».

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