Передача данных между шаблонами
У меня простой случай, когда шаблоны (text/templates)
включает в себя еще один, как это
`index.html`
{{ template "image_row" . }}
`image_row.html`
{{ define "image_row" }}
To stuff here
{{ end }}
Теперь я хочу повторно использовать шаблон строки изображения. Допустим, я хотел бы передать простое число, чтобы шаблон image_row строил строки в соответствии с этим числом
Я хотел бы иметь что-то подобное (где 5 является дополнительным аргументом)
index.html
{{ template "image_row" . | 5 }}
Как я мог добиться этого в этом случае?
2 ответа
Я не уверен, существует ли встроенное решение для передачи нескольких аргументов в вызов шаблона, но, если его нет, вы можете определить функцию, которая объединяет свои аргументы и возвращает их как одно значение слайса, тогда вы можете зарегистрируйте эту функцию и используйте ее в вызове шаблона.
Что-то вроде:
func args(vs ...interface{}) []interface{} { return vs }
t, err := template.New("t").Funcs(template.FuncMap{"args":args}).Parse...
Тогда в вашем index.html
, вы бы сделали это:
{{ template "image_row" args . 5 }}
А потом внутри вашего image_row
шаблон вы можете получить доступ к аргументам с помощью встроенного index
функционировать так:
{{ define "image_row" }}
To stuff here {{index . 0}} {{index . 1}}
{{ end }}
Там нет встроенных для этого. Вы можете добавить функцию, которая создает карту, и использовать ее в дочернем шаблоне:
func argsfn(kvs ...interface{}) (map[string]interface{}, error) {
if len(kvs)%2 != 0 {
return nil, errors.New("args requires even number of arguments.")
}
m := make(map[string]interface{})
for i := 0; i < len(kvs); i += 2 {
s, ok := kvs[i].(string)
if !ok {
return nil, errors.New("even args to args must be strings.")
}
m[s] = kvs[i+1]
}
return m, nil
}
Добавьте функцию в шаблон следующим образом:
t := template.Must(template.New("").Funcs(template.FuncMap{"args": argsfn}).Parse(......
Используйте это так:
{{template "image_row" args "row" . "a" 5}}{{end}}
{{define "image_row"}}
{{$.row}} {{$.a}}
{{end}}
Запустите его на детской площадке
Преимущество использования карты в том, что аргументы являются "именованными". Преимущество использования фрагмента, как описано в другом ответе, состоит в том, что код намного проще.