我正在构建go web应用程序。我在渲染的html页面上发现了一些异常现象。我的所有html评论<!-- -->
都突然没有被渲染。我的猜测是因为我使用的版本(刚刚更新到更高版本),因为在我更新它之前它很好。
这是我的代码:
<!-- prepare the breadcrumbs -->
<ul class="breadcrumb" data-bind="foreach: viewModel.breadcrumbs">
<!-- ko if: ($index() + 1) < len(viewModel.breadcrumbs()) -->
<li>
<a data-bind="attr: { href: href }">
<i class="fa fa-home"></i>
<span data-bind="text: title"></span>
</a>
</li>
<!-- /ko -->
<!-- ko if: ($index() + 1) == len(viewModel.breadcrumbs()) -->
<li class="active" data-bind="text: title"></li>
<!-- /ko -->
</ul>
这是呈现的页面源:
由于这个问题,我使用无容器控制流语法编写的许多KnockoutJS代码都很疯狂,它根本不起作用。
我该怎么做才能解决这个问题?提前致谢
答案 0 :(得分:10)
html/template
包中有一种特殊类型:template.HTML
。在渲染模板时,模板中此类型的值不会被转义。
因此,您可以将HTML评论“标记”为template.HTML
,因此在执行模板时不会对其进行转义或省略。
执行此操作的一种方法是为模板注册自定义函数,该函数可以从模板中调用,该函数采用string
参数并将其返回为template.HTML
。您可以将所有HTML注释“传递”到此函数,因此,HTML注释将保留在输出中。
见这个例子:
func main() {
t := template.Must(template.New("").Funcs(template.FuncMap{
"safe": func(s string) template.HTML { return template.HTML(s) },
}).Parse(src))
t.Execute(os.Stdout, nil)
}
const src = `<html><body>
{{safe "<!-- This is a comment -->"}}
<div>Some <b>HTML</b> content</div>
</body></html>`
输出(在Go Playground上尝试):
<html><body>
<!-- This is a comment -->
<div>Some <b>HTML</b> content</div>
</body></html>
所以基本上在注册我们的safe()
函数后,将所有HTML注释转换为调用此safe()
函数的模板操作并传递原始HTML注释。
转换它:
<!-- Some HTML comment -->
对此:
{{safe "<!-- Some HTML comment -->"}}
或者(无论你喜欢什么):
{{"<!-- Some HTML comment -->" | safe}}
你很高兴。
注意:如果你的HTML评论包含引号('"'
),你可以/必须像这样逃避它:
{{safe "<!-- Some \"HTML\" comment -->"}}
注意#2:请注意,您不应使用条件HTML注释,因为这可能会破坏html/template
包的上下文敏感转义。有关详细信息,请阅读this。
答案 1 :(得分:0)
您可以使用text/template
代替html/template
,并使用内置函数(例如html
和js
(https://golang.org/pkg/text/template/#hdr-Functions)手动转义。请注意,这很容易出错。