2013-03-04 42 views
4

目標:在HTTP服務器中使用多個模板,我想在某些字符串上將換行符更改爲<br/>標記。具有FuncMap的多個模板

一個精簡例如:

我有兩個模板a.tmplb.tmpl這是這樣的:

Template a {{dosomething}} 

(以及類似的其他模板)。兩者都位於名爲templates的目錄中。我相信我需要創建一個函數來做\n - ><br />替換(上面的dosomething)。

這是我的(非工作)的示例代碼:

package main 

import (
    "log" 
    "text/template" 
) 

func main() { 
    // funcMap := template.FuncMap{ 
    // "dosomething": func() string { return "done something" }, 
    // } 

    templates, err := template.ParseGlob("templates/*.tmpl") 
    if err != nil { 
     log.Fatal(err) 
    } 
    log.Printf("%#v", templates) 

} 

的錯誤信息是:

2013/03/04 20:08:19 template: a.tmpl:1: function "dosomething" not defined 
exit status 1 

這是有意義的,因爲在分析時間,函數dosomething是未知的。

  1. 如何在多個模板中使用我的功能?是否需要this question here on so的答案?
  2. 這是正確的方法嗎?請記住,我想更改某些字符串上的文本,類似於文檔中的標題示例(http://golang.org/pkg/text/template/#FuncMap - 示例(Func))?
  3. 如何在下面的代碼訪問b.tmpl

    package main 
    
    import (
        "log" 
        "text/template" 
    ) 
    
    func main() { 
        funcMap := template.FuncMap{ 
         "dosomething": func() string { return "done something" }, 
        } 
    
        t, err := template.New("a.tmpl").Funcs(funcMap).ParseGlob("templates/*.tmpl") 
        if err != nil { 
         log.Fatal(err) 
        } 
        log.Printf("%#v", t) 
    } 
    

回答

3

你的代碼最後片段看起來約我的權利。

要渲染b.tmpl,只需撥打

t.ExecuteTemplate(w, "b.tmpl", data) 

您可以訪問a.tmpl以同樣的方式;我建議這樣做是爲了保持一致性,而不是在新的調用中將名稱設置爲「a.tmpl」。

+0

我不太理解你答案的第二部分 - 如何以同樣的方式訪問'a.tmpl'。我需要調用'Funcs(funcMap)'類似於「inbetween」一個新的和'ParseGlob(...)' – topskip 2013-03-04 21:29:04

+0

@topskip我的意思是你應該通過調用t.ExecuteTemplate(w,「a.tmpl」 ,數據)而不是通過調用t.Execute(w,data)。這樣,這兩個模板被平等對待。然後,您可以將所有模板的集合命名爲「a.tmpl」。 – andybalholm 2013-03-04 22:57:00

+2

這就是我現在擁有的:'t,err:= template.New(「」)。Funcs(funcMap).ParseGlob(「templates/*。tmpl」)'然後't.ExecuteTemplate(os.Stdout,「 b.tmpl「,」你好「) - 這工作正常。與其他模板相同。謝謝! – topskip 2013-03-05 09:29:41

相關問題