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