1

我在尝试通过 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 原样以纯文本形式显示出来。

4

1 回答 1

2

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

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

于 2019-04-30T00:12:12.293 回答