Обновление вложенных шаблонов Golang - PullRequest
0 голосов
/ 10 февраля 2019

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

Основной макет

{{define "layout"}}
    <html>
    <body>
        {{ template "content" }}
    </body>
    </html>
{{end}}

Подшаблон 1

{{ define "content" }}

<h1 style="color: red;">Page 1!</h1>

{{ end }}

Подшаблон 2

{{ define "content" }}

<h1 style="color: blue;">Page 2!</h1>

{{ end }}

Код Go

package main

import (
    "html/template"
    "net/http"
    "strings"
)

var tpl *template.Template

func init() {
    tpl = template.Must(template.ParseGlob("templates/*.gohtml"))
}

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, r *http.Request) {

    path := strings.Trim(r.URL.Path, "/")
    switch path {
    case "":
        path = ("index.gohtml")
    default:
        path = (path + ".gohtml")
    }

    err := tpl.ExecuteTemplate(w, "layout", path)
    if err != nil {
        http.Error(w, err.Error(), http.StatusInternalServerError)
        return
    }
}

Я также пытался выполнить ParseFiles перед выполнением, но безуспешно,Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Наконец-то я заставил его работать, но только когда не следовал инструкциям.

Решение Часть 1

Пропустить {{define}} и {{end}} в шаблонах.Странно ...

<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Go Web Programming</title>
  </head>
  <body>
    layout level
    {{ template "content" . }}
  </body>
</html>

И в подшаблонах ...

<h1 style="color: red;">Page 1!</h1>

Часть решения 2

Я нашел фрагмент кодас AddParsTree, как упомянул Эли, и вот код (упрощенный без обработки ошибок)

package main

import (
    "html/template"
    "net/http"
    "strings"
)

var tpl *template.Template

func init() {
    tpl = template.Must(template.ParseGlob("templates/*.html"))
}

func main() {
    http.HandleFunc("/", index)
    http.ListenAndServe(":8080", nil)
}

func index(w http.ResponseWriter, r *http.Request) {

    path := strings.Trim(r.URL.Path, "/")
    switch path {
    case "":
        path = ("home.html")
    default:
        path = (path + ".html")
    }

    layout := tpl.Lookup("layout.html")
    layout, _ = layout.Clone()
    t := tpl.Lookup(path)
    _, _ = layout.AddParseTree("content", t.Tree)
    layout.Execute(w, "")

Я не очень понимаю, почему я должен не повиноваться руководствам, чтобы заставить его работать.Любые комментарии, которые просвещают меня, будут оценены.

0 голосов
/ 11 февраля 2019

Настройка пути после разбора шаблонов, по-моему, слишком поздно.

Что может сработать (хотя я не уверен, что это самое элегантное решение здесь) - это использовать метод AddParseTree:

AddParseTree добавляет дерево разбора для шаблона с заданным именем и связывает его с t.Если шаблон еще не существует, он создаст новый.Если шаблон существует, он будет заменен.

Применительно к вашему делу, исходя из условия, что вы Parse будете иметь соответствующий файл шаблона (подшаблон 1 или 2), а затем добавите егос AddParseTree до tpl, прежде чем выполнить его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...