8

我正在构建 Go Web 应用程序。我在呈现的 html 页面上发现了一些异常。我所有的 html 评论<!-- -->突然没有被渲染。我猜是因为我使用的go版本(刚刚更新到更高版本),因为在我更新之前它很好。

这是我的代码:

<!-- 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 代码变得疯狂,它根本不起作用。

我应该怎么做才能解决这个问题?提前致谢

4

2 回答 2

14

包中有一个特殊的类型html/templatetemplate.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包的上下文敏感转义。有关详细信息,请阅读

于 2015-12-18T08:08:57.280 回答
0

您可以使用和( https://golang.org/pkg/text/template/#hdr-Functions )等内置函数text/template代替并手动进行所有转义。请注意,这很容易出错。html/templatehtmljs

于 2015-12-18T04:34:39.973 回答