模板部分呈现为纯文本

Template partially rendering as plaintext

我在尝试通过 Go html 模板处理一件特定的事情时遇到了问题。

(为简洁起见,全部为 condensed/simplified)

我有一个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。

解决方案比我想象的要简单得多。 我没有使用正确的措辞来找到这个 SO 答案,但它完美地解决了这个问题:Go template.ExecuteTemplate include html

要点是我需要将 DeviceLinkList 类型设为 template.HTML 而不是字符串,当我为其赋值时,它需要是 deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")