【问题标题】:Golang html/templates : ParseFiles with custom DelimsGolang html/templates : 带有自定义 Delims 的 ParseFiles
【发布时间】:2014-11-26 11:08:13
【问题描述】:

在使用template.New("...").Delims("[[", "]]").Parse() 时,使用带有分隔符的模板可以正常工作 但是,我无法弄清楚如何使用 template.ParseFiles() 获得相同的结果

tmpl, err := template.ParseFiles("base.tmpl", "homepage/inner.tmpl")
if err != nil { panic(err) }
tmpl.Delims("[[", "]]")
p := new(Page) 
err = tmpl.Execute(os.Stdout, p)
if err != nil { panic(err) }

我没有错误,但分隔符没有更改。

tmpl, err := template.ParseFiles("base.tmpl", "homepage/inner.tmpl")
t := tmpl.Lookup("base.tmpl").Delims("[[", "]]")
p := new(Page) 
err = t.Execute(os.Stdout, p)
if err != nil { panic(err) }

这导致相同的结果。

如果这是相关的,我需要在我网站的特定页面中嵌入一个小的 Angular 应用程序。

另外,我有一个具有通用 HTML 结构的基本模板,我将其与特定于页面的模板与 ParseFiles() 结合在一起,形成了这种布局:

/templates/base.tmpl
/templates/homepage/inner.tmpl
/templates/otherpage/inner.tmpl

这可能吗?如果是这样,我做错了什么?

【问题讨论】:

  • 看起来你应该可以从the docs 执行template.New(...).Delims(...).ParseFiles(...)。这是索引中的第二个 ParseFiles,而不是第一个。
  • 确实!尽管我已经为此工作了很长时间,但在发布问题后不久我就发现了这一点。我很难理解这个包裹 :) 感谢您的帮助!
  • 对于未来的读者,我缺少的另一个细节是我需要始终使用 template.New("base.tmpl") 将任何页面的模板命名为“base.tmpl”。我猜那是因为它是在解析的模板集中使用的根模板的名称。

标签: angularjs templates go


【解决方案1】:

创建一个虚拟模板,设置分隔符,然后解析文件:

 tmpl, err := template.New("").Delims("[[", "]]").ParseFiles("base.tmpl", "homepage/inner.tmpl")

API 的这一方面很古怪而且不是很明显。当模板包具有额外的 Set 类型时,API 在早期更有意义

【讨论】:

  • 其他人注意:template.New() 的空白“”参数对我造成了运行时恐慌。将 template.New("") 替换为 template.New("some_template_name")
  • 不仅是@codefreak 所说的,而且您还必须使用给定的名称调用 ExecuteTemplate。只调用 Execute 会给你一个 nil 指针取消引用恐慌。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
  • 2017-09-29
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
相关资源
最近更新 更多