Частичное отображение шаблона в виде открытого текста - PullRequest
1 голос
/ 30 апреля 2019

У меня проблемы с одной конкретной вещью, которую я пытаюсь использовать в шаблонах Go html.

(для краткости все будет сжато / упрощенно)

У меня есть один base шаблон:

<html>
    <head>
        <title>{{ .Title }}</title>
    </head>
    <body>
        {{ template .PageBody . }}
    </body>
</html>

И device шаблон:

{{ define "device" }}
<div class="nav">
    <div class="links">
        {{ .DeviceLinkList }}
    </div>
</div>
<div class="textData">
    <div class="deviceNick">
        {{ .Nickname }}
    </div>
</div>
{{ end }}

То, как я это настроил, выглядит примерно так:

В файле main.go:

package main
import "html/template" //among others, of course. 

var err error
var tmplInit *template.Template
type TemplVals struct{
    Title       string
    Version     string
    Release     string
    PageBody    string
}
var templVals TemplVals

func init(){
    // Prepare GOHTML templates
    tmplInit, err = template.ParseGlob("./html_templates/*.gohtml")
    if err != nil { log.Panic("Cant load templates! ", err) }
    templVals.Version = serverDetails["version"]
    templVals.Release = serverDetails["release"]
}

//Main only has MUX routing using Gorilla Mux

В файле deviceController.go:

type DeviceValues struct{
    DeviceLinkList string
    Nickname string
    Title string
}


func home(w http.ResponseWriter, r *http.Request){
    w.Header().Set("Content-Type", "text/html; charset=utf-8")
    var deviceData DeviceValues

    // Seems to not be loaded as HTML when passed to template?
    deviceData.DeviceLinkList = loadDeviceList("example") 

    deviceData.Nickname = loadDeviceData("example")
    deviceData.PageBody = "device"
    deviceData.Title = "Home"

    tmplErr := tmplInit.Execute(w, deviceData)
    if tmplErr != nil{ log.Panic(tmplErr) }
}

func loadDeviceList(user string)(string){
    var deviceid, linkList string
    linkList = `<ul>`
    for getIDs.Next(){
        err = getIDs.Scan(&deviceid) // SQL gathers this
        if err != nil { panic(err) }
        linkList = linkList + `<li><a href="#" onclick="loadDevice('`+deviceid+`')">`+deviceid+`</a></li>`
    }
    linkList = linkList + `</ul>`

    return linkList
}

func loadDeviceData(user string)(string){
    //SQL retrieves data for devices associated to passed in user
    //for brevity:
    return "Example Nickname"
}

Проблема в том, что псевдоним загружен правильно, и есть другие поля, такие как уровни заряда батареи и показания датчиков, которые проходят через все должным образом и могут даже использоваться в функциях JS, но DeviceLinkList отображается в обычной строке независимо от того, что я делать. Это не список, он просто извлекает HTML как есть.

1 Ответ

2 голосов
/ 30 апреля 2019

Решение намного проще, чем я думал. Я не использовал правильную формулировку, чтобы найти этот SO-ответ, но он прекрасно ее решает: Go template.ExecuteTemplate включает html

Суть в том, что мне нужно сделать DeviceLinkList тип template.HTML вместо строки, и когда я присваиваю ему значение, оно должно быть deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")

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