我正在尝试进行模块化设计,通过AJAX更新HTML页面的一部分(选择控件)。初始页面是:
<html><body>
<div id="selectDiv">
{{template "selectTemplate" .SelectData}}
</div>
</body></html>
// Go data for the selectTemplate
type SelectData struct {
SelectId string
SelectOptions map[string]string
}
selectTemplate.gohtml是:
{{define "selectTemplate"}}
<select id="{{.SelectId}}">{{range $key, $val := .SelectOptions}}
<option value={{$key}}>{{$val}}</option>{{end}}
</select>
{{end}}
发送到服务器以向select添加新选项的AJAX请求执行(转到lang代码),并通过以下方式重新使用selectTemplate:
ExecuteTemplate(w, "selectTemplate.gohtml", selectData)
和AJAX响应处理程序应该使用以下内容更新选择:
element = document.getElementById("selectDiv")
element.innerHTML = xhr.responseText
问题是,AJAX xhr.responseText作为零长度字符串返回Javascript,因为ExecuteTemplate调用显然由于 模板中的{ {define“ selectTemplate”}}指令。结果,除了没有如下所示的{ {define“ selectTemplate”}}包装外,我需要创建第二个模板(完全相同):
<select id="{{.SelectId}}">{{range $key, $val := .SelectOptions}}
<option value={{$key}}>{{$val}}</option>{{end}}
</select>
为了使ExecuteTemplate调用正常工作。
是否有任何方法可以定义单个模板以使其正常工作,还是我坚持使用两个基本相同的模板?似乎ExecuteTemplate调用应该忽略{ {define“ selectTemplate”}}包装程序,但相反会导致失败。