2014-11-24 123 views
3

带分隔符使用模板使用template.New("...").Delims("[[", "]]").Parse() 时,但是工作得很好,我无法弄清楚如何获得相同的结果与template.ParseFiles()Golang HTML /模板:自定义ParseFiles Delims

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) } 

这导致了相同的结果。

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

另外,我有一个普通的HTML结构,我与ParseFiles()特定的页面模板结合了基本模板,导致这种布局:

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

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

+1

的初期,API变得更有意义它看起来应该能够执行'template.New(...).Deims(...).ParseFiles(。 ..)'从[文档](http://golang.org/pkg/html/template/#Template.ParseFiles)。这是索引中的第二个ParseFiles,不是第一个。 – twotwotwo 2014-11-24 22:20:53

+1

确实!尽管我已经研究了很长一段时间,但在发布问题后我想了一会儿。我发现很难将这个包裹在头上:)感谢您的帮助! – 2014-11-24 22:32:58

+1

对于未来的读者,我缺乏的另一个细节是我需要始终使用template.New(“base.tmpl”)为任何页面命名模板“base.tmpl”。我想这是因为它是在解析模板集中使用的根模板的名称。 – 2014-11-24 22:45:28

回答

5

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

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

API的这一方面是古怪的,不是很明显。在模板包有额外设置类型

+1

其他注意事项:template.New()的Blank参数导致运行时恐慌。将template.New(“”)替换为template.New(“some_template_name”) – codefreak 2015-05-31 15:59:50

+1

不仅@codefreak说了什么,而且还必须使用给定的名称调用ExecuteTemplate。调用只是执行会给你一个无指针解引用恐慌。 – THUNDERGROOVE 2015-06-17 20:55:02