Передача данных между шаблонами

У меня простой случай, когда шаблоны (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 }}

https://play.golang.org/p/gkdtvvJ1bb

Там нет встроенных для этого. Вы можете добавить функцию, которая создает карту, и использовать ее в дочернем шаблоне:

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}}

Запустите его на детской площадке

Преимущество использования карты в том, что аргументы являются "именованными". Преимущество использования фрагмента, как описано в другом ответе, состоит в том, что код намного проще.

Другие вопросы по тегам