2017-03-06 42 views
2

我有三個連接的模板。 base.htmlmenu.htmlusers.html。但是當我執行這些模板時,我只能從base.html訪問上下文的數據。無法從html /模板訪問數據Golang

這裏是我的處理程序:

func HandlerUser(res http.ResponseWriter, req *http.Request){ 
if req.Method == "GET" { 
    context := Context{Title: "Users"} 
    users,err:= GetUser(0) 
    context.Data=map[string]interface{}{ 
     "users": users, 
    } 
    fmt.Println(context.Data) 
    t,err := template.ParseFiles("public/base.html") 
    t,err = t.ParseFiles("public/menu.html") 
    t,err = t.ParseFiles("public/users.html") 
    err = t.Execute(res,context) 
    fmt.Println(err) 
} 
} 

這是我想說明在用戶模板

{{ range $user := index .Data "users" }} 
<tr id="user-{{ .Id }}"> 
    <td id="cellId" >{{ $user.Id }}</td> 
    <td id="cellUserName" >{{ $user.UserName }}</td> 
</tr> 
{{ end }} 

注意什麼:我可以訪問"{{.Title}}"是在base.html模板中使用。

回答

1

首先,您應該檢查Template.ParseFiles()方法返回的錯誤。你存儲返回的錯誤,但你只在最後檢查它(然後它被覆蓋3次)。

接下來,永遠不會分析請求處理程序中的模板,這太耗費時間和資源浪費。在啓動時(或首次要求)做一次。詳情請參閱It takes too much time when using "template" package to generate a dynamic web page to client in golang

接下來,您可以一次解析多個文件,只需枚舉所有傳遞到Template.ParseFiles()函數(有一個方法和一個函數)。

知道Template.Execute()只執行一個(指定)模板。您有3 關聯的模板,但只有"base.html"模板由您的代碼執行。要執行一個特定的,請命名爲模板,請使用Template.ExecuteTemplate()。詳情請參閱Telling Golang which template to execute first

首先,您應該定義結構您的模板,決定哪些模板包含其他模板,並執行「包裝器」模板(使用Template.ExecuteTemplate())。當你執行一個調用/包含另一個模板的模板時,你可以告訴你傳遞給它的執行的值(數據)。當您編寫{{template "something" .}}時,這意味着您想要將當前指向的點值傳遞給名爲"something"的模板的執行。閱讀更多關於此:golang template engine pipelines

要了解有關模板關聯和內部結構的更多信息,請閱讀此答案:Go template name

所以在你的情況下,我會想象"base.html"是包裝,外部模板,其中包括"menu.html""users.html"。所以"base.html"應該包含類似於這樣的行:

{{template "menu.html" .}} 

{{template "users.html" .}} 

以上線路將調用,包括所提到的模板的結果,將數據傳遞給它們的執行傳遞給"base.html"(如果點沒有變化)。

使用template.ParseFiles()功能(沒有方法)這樣的解析文件:

var t *template.Template 

func init() { 
    var err error 
    t, err = template.ParseFiles(
     "public/base.html", "public/menu.html", "public/users.html") 
    if err != nil { 
     panic(err) // handle error 
    } 
} 

並且處理函數中執行它是這樣的:

err := t.ExecuteTemplate(w, "base.html", context) 
+0

謝謝回答。我沒有把點管道傳遞數據 –