Как отправить данные на шаблон gohtml - PullRequest
0 голосов
/ 18 июня 2020

Я пытаюсь выучить Golang. Я хочу просто отправлять данные для просмотра. Но данные не доходят до main. gohtml. Я не мог понять причину. Если я распечатаю данные из define, это сработает. Но если я хочу напечатать данные в define "content" (идет в main. gohtml), данные будут пустыми.

define "title" деталь работает. Просто я не могу отправить данные с переменной. Если я удалю часть {{.text}} и напишу что-нибудь, все заработает.

main. go file

var tpl *template.Template

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

func main() {
    http.HandleFunc("/about", fabout)
    http.ListenAndServe(":80", nil)
}

func fabout(w http.ResponseWriter, r *http.Request) {
    values, isset := r.URL.Query()["text"]

    var value string

    if isset == true {
        value = values[0]
    } else {
        value = ""
    }

    data := map[string]interface{}{
        "text": value,
    }

    tpl.ExecuteTemplate(w, "about.gohtml", data)
}

о. gohtml

{{template "main"}}
{{define "title"}}About me{{end}} //this is working
{{define "content"}}{{.text}}{{end}} //this is not working
{{.text}} //this is working

основной. gohtml

{{define "main"}}
<!doctype html>
<html lang="en">
    <head>
        <meta charset="utf-8">
        <title>{{template "title"}}</title>
    </head>

    <body>
        <ul>
            <li><a href="">Page 1</a></li>
            <li><a href="">Page 2</a></li>
            <li><a href="">Page 3</a></li>
            <li><a href="">Page 4</a></li>
            <li><a href="">Page 5</a></li>
        </ul>

        <div style="padding:100px 0;">{{template "content"}}</div>

        <footer>
            this is footer
        </footer>
    </body>
</html>
{{end}}

Ответы [ 2 ]

2 голосов
/ 18 июня 2020

При вызове шаблона вам необходимо передать все необходимые данные. Синтаксис из документов :

{{template "name"}} Шаблон с указанным именем выполняется с нулевыми данными.

{{template "name" pipeline}} Шаблон с указанное имя выполняется с точкой, установленной на значение конвейера.

Таким образом, простой способ исправить это - передать . при вызове main:

{{template "main" .}

и то же самое при вызове контента:

{{template "content" .}}

И, наконец, контент может использовать значение:

{{define "content"}}{{.text}}{{end}}

примечание: использование аргумента . передает все данные; вы также можете просто передать .text в main (а затем использовать . при вызове content и внутри содержимого ({{.}}).

Для упрощенного рабочего примера см. на этой игровой площадке .

0 голосов
/ 18 июня 2020

Мое наблюдение: здесь, в этой функции ниже, переменная value пуста. там я добавил строку (value = "Okay") для тестирования, и она работает.

func fabout(w http.ResponseWriter, r *http.Request) {
    values, isset := r.URL.Query()["text"]

    var value string

    if isset == true {
        value = values[0]
    } else {
        value = ""
    }
     value = "Okay" // THIS LINE ADDED EXTRA
    data := map[string]interface{}{
        "text": value,
    }

    tpl.ExecuteTemplate(w, "about.gohtml", data)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...