2016-11-21 161 views
2

下面是問題:每個頁面的content部分有幾個article s,我想在每篇文章下面插入likebar模板。如何擴展模板?

所以base.tmpl就像是:

<html> 
    <head>  
    {{template "head.tmpl" .}} 
    </head> 
    <body>  
    {{template "content.tmpl" .}} 
    </body> 
</html> 

article.tmpl我想有:

{{define "content"}}  
      <div>article 1 
      {{template "likebar.tmpl" .}} 
      </div> 
      <div>article 2 
      {{template "likebar.tmpl" .}} 
     </div> 
     ... //these divs are generated dynamically 
    {{end}} 

如何我html/template實現這一目標? 我試圖插入base.tmpl一個{{template "iconbar" .}},然後嵌套{{template "likebar.tmpl" .}}{{define "content"但它失敗:

Template File Error: html/template:base.tmpl:122:12: no such template "likebar.tmpl"

回答

2

只能包括/插入associated templates

如果有多個模板文件,請使用template.ParseFiles()template.ParseGlob()解析它們所有,結果模板將所有的模板,已經關聯,這樣他們就可以互相引用。

如果您確實使用上述功能來分析您的模板,那麼找不到likebar.tmpl的原因是因爲您指的是無效名稱(例如缺少文件夾名稱)。

string源解析時,可以使用Template.Parse()方法,該方法還將嵌套模板關聯到頂層模板。

看到這些2工作實例:

func main() { 
    t := template.Must(template.New("").Parse(templ1)) 
    if err := t.Execute(os.Stdout, nil); err != nil { 
     panic(err) 
    } 

    t2 := template.Must(template.New("").Parse(templ2)) 
    template.Must(t2.Parse(templ2Like)) 
    if err := t2.Execute(os.Stdout, nil); err != nil { 
     panic(err) 
    } 
} 

const templ1 = `Base template #1 
And included one: {{template "likebar"}} 
{{define "likebar"}}I'm likebar #1.{{end}} 
` 

const templ2 = `Base template #2 
And included one: {{template "likebar"}} 
` 

const templ2Like = `{{define "likebar"}}I'm likebar #2.{{end}}` 

輸出(嘗試在Go Playground):

Base template #1 
And included one: I'm likebar #1. 

Base template #2 
And included one: I'm likebar #2.