无法执行嵌套模板

时间:2018-08-25 01:04:42

标签: go go-html-template

我正在尝试进行模块化设计,通过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”}}包装程序,但相反会导致失败。

0 个答案:

没有答案