我想通过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。
答案 0 :(得分:2)
解决方案比我想象的简单得多。 我没有使用正确的措词来找到该答案,但它可以完美解决:Go template.ExecuteTemplate include html
要点是我需要使DeviceLinkList
类型为template.HTML
而不是字符串,并且在给它赋一个值时,它必须为deviceData.DeviceLinkList = template.HTML("<ul><li>list1</li><li>list2</li></ul>")