2017-04-06 12 views
5

Similar question answered here, nhưng tôi không nghĩ nó giải quyết được vấn đề của tôi.Tìm mẫu: không thể đánh giá trường X theo loại Y (X không phải là một phần của Y nhưng bị mắc kẹt trong vòng lặp {{range}})

Hãy nói rằng bạn có struct sau:

type User struct { 
    Username string 
    Password []byte 
    Email string 
    ... 
} 

Hơn nữa, URL có một cấu trúc như thế này: example.com/en/users, trong đó "en" là một param URL sẽ được thông qua vào mẫu như thế này:

renderer.HTML(w, http.StatusOK, "users/index", map[string]interface{}{ 
    "lang": chi.URLParam(r, "lang"), 
    "users": users}) 

Và trong mẫu HTML tôi đã điều sau đây:

{{ range .users }} 
    <form action="/{{ .lang }}/users" method="POST"> 
    <input type="text" name="Username" value="{{ .Username }}"> 
    <input type="text" name="Email" value="{{ .Email }}"> 
    </form> 
{{ end }} 

Bây giờ, vấn đề là bởi vì {{.lang}} không phải là một phần của cấu trúc người dùng sau đó tôi nhận được lỗi .. vì vậy làm thế nào tôi có thể truy cập {{.lang}} bên trong {{range .users}}?

+0

Bạn có thể khai báo VAR trong một mẫu Go '{{$ lang: = .lang}} {{phạm vi .users}} ... '. https://golang.org/pkg/text/template/#hdr-Variables – mkopriva

Trả lời

7

Nội dung của dấu chấm (.) được giao cho $ sau khi gọi trình range, vì vậy bạn có thể sử dụng $ để truy cập lang (on play):

{{ range .users }} 
    <form action="/{{ $.lang }}/users" method="POST"> 
    <input type="text" name="Username" value="{{ .Username }}"> 
    <input type="text" name="Email" value="{{ .Email }}"> 
    </form> 
{{ end }} 

Các hành vi được ghi chép lại here:

Khi bắt đầu thực hiện, $ được đặt thành đối số dữ liệu được chuyển đến Execute, tức là, với giá trị bắt đầu thực hiện t.

Nếu bạn đang sử dụng dải ô lồng nhau, bạn luôn có thể quay lại để gán dấu chấm cho dấu chấm khác bằng cách sử dụng câu lệnh gán with hoặc câu lệnh gán biến. Xem the other answer cho điều đó.

+0

Cú pháp của bạn bị tắt và cũng không thực sự hoạt động theo cách đó, ngữ cảnh vẫn được đặt cho bất kỳ thứ gì bạn đang sử dụng. https://play.golang.org/p/Qz63RBwdZh – mkopriva

+1

True. Sửa lỗi đó. – nemo

+0

Tuyệt vời, cảm ơn rất nhiều :)! – fisker

2

Bạn có thể sử dụng một biến cho .lang

{{ $lang := .lang }} 
{{ range .users }} 
    <form action="/{{ $lang }}/users" method="POST"> 
    <input type="text" name="Username" value="{{ .Username }}"> 
    <input type="text" name="Email" value="{{ .Email }}"> 
    </form> 
{{ end }} 

Xem ở đây tại tài liệu: https://golang.org/pkg/text/template/#hdr-Variables

+1

Cảm ơn rất nhiều, tôi thật đáng buồn vì tôi đã chấp nhận câu trả lời của nemo (vì anh ấy nhanh hơn 1 phút và tôi đã sử dụng nó theo cách đó, mặc dù tôi chắc chắn trong tương lai tôi sẽ muốn làm các định nghĩa như bạn đã cho thấy, vì vậy tôi muốn có thể chấp nhận cả hai) – fisker

Các vấn đề liên quan