模板部分呈现为纯文本

时间:2019-04-29 22:55:36

标签: go go-html-template

我想通过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 个答案:

答案 0 :(得分:2)

解决方案比我想象的简单得多。 我没有使用正确的措词来找到该答案,但它可以完美解决:Go template.ExecuteTemplate include html

要点是我需要使DeviceLinkList类型为template.HTML而不是字符串,并且在给它赋一个值时,它必须为deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")