2012-04-17 47 views
28

Nó nhận thấy một điều lạ với Go mẫu khi tôi cố gắng sử dụng FuncsFuncMap. Các mã sau đây làm việc như mong đợi:Go mẫu chức năng

buffer := bytes.NewBufferString("") 

funcMap := template.FuncMap{ 
    "label": strings.Title, 
} 

t, _ := template.New("alex").Funcs(funcMap).Parse("{{label \"alex\"}}") 

t.Execute(buffer, "") 

return string(buffer.Bytes()) //=> "Alex" 

Nhưng khi tôi cố gắng để đưa các mẫu trong một tập tin, nó không hoạt động (Execute() nói: "alex" is an incomplete or empty template):

t, _ := template.New("alex").Funcs(funcMap).ParseFiles("template.html") 

Với template.html:

{{label \"alex\"}} 

Bất kỳ ý tưởng nào tại sao? Đây có phải là một lỗi ? Có cách nào đơn giản hơn để sử dụng các phương thức/chức năng trong các mẫu?

+0

ý tưởng đầu tiên là để kiểm tra lỗi từ Parse và Execute. Mã của bạn ở trên bỏ qua cả hai. – Sonia

+0

Vâng tôi đã kiểm tra Parse nhưng không thực thi. Execute nói: "" alex "là mẫu không hoàn chỉnh hoặc trống" – Blacksad

Trả lời

31

ParseFiles có thể sử dụng tài liệu tốt hơn. Một đối tượng mẫu có thể có nhiều mẫu trong đó và mỗi mẫu có một tên. Nếu bạn xem xét việc triển khai ParseFiles, bạn thấy rằng nó sử dụng tên tệp làm tên mẫu bên trong đối tượng mẫu. Vì vậy, đặt tên tệp của bạn giống như đối tượng mẫu, (có thể không phải là thường thực tế) hoặc sử dụng ExecuteTemplate thay vì chỉ thực hiện.

+1

Bạn rất tuyệt, nó hoạt động! Rất tốt bắt. Và tôi đã buộc phải sử dụng .New (tên) vì không có điều này bạn không thể gọi .Funcs() ... – Blacksad

15

Câu trả lời của Sonia đúng về mặt kỹ thuật nhưng lại khiến tôi bối rối hơn. Đây là cách tôi cuối cùng đã nhận được nó làm việc:

t, err := template.New("_base.html").Funcs(funcs).ParseFiles("../view/_base.html", "../view/home.html") 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
    return 
} 
err = t.Execute(w, data) 
if err != nil { 
    fmt.Fprint(w, "Error:", err) 
    fmt.Println("Error:", err) 
} 

Tên của mẫu là tên tệp trống của mẫu, chứ không phải đường dẫn đầy đủ. Execute sẽ thực thi mẫu mặc định được cung cấp nó được đặt tên để khớp, vì vậy không cần sử dụng ExecuteTemplate.

Trong trường hợp này, _base.html tập tin là container ngoài cùng, ví dụ:

<!DOCTYPE html> 
<html><body> 
<h1>{{ template "title" }}</h1> 
{{ template "content" }} 
</body></html> 

khi home.html xác định các phần cụ thể:

{{ define "title" }}Home{{ end }} 

{{ define "content" }} 
Stuff 
{{ end }} 
Các vấn đề liên quan