В шаблонах Go, доступ к родительскому/глобальному конвейеру в пределах диапазона
Возможно ли, в рамках действия {{range pipeline}} T1 {{end}}
в пакете text/template
получить доступ к значению конвейера до действия диапазона или родительскому/глобальному конвейеру, переданному в качестве аргумента для выполнения?
Рабочий пример, который показывает, что я пытаюсь сделать:
package main
import (
"os"
"text/template"
)
// .Path won't be accessible, because dot will be changed to the Files element
const page = `{{range .Files}}<script src="{{html .Path}}/js/{{html .}}"></script>{{end}}`
type scriptFiles struct {
Path string
Files []string
}
func main() {
t := template.New("page")
t = template.Must(t.Parse(page))
t.Execute(os.Stdout, &scriptFiles{"/var/www", []string{"go.js", "lang.js"}})
}
play.golang.org
Ответы
Ответ 1
Использование переменной $(рекомендуется)
Из пакета text/template документация:
Когда выполнение начинается, $устанавливается на аргумент данных, переданный в Execute, то есть на начальное значение точки.
Как указывает @Sandy, поэтому можно получить доступ к Пути во внешней области с помощью $.Path
.
const page = `{{range .Files}}<script src="{{html $.Path}}/js/{{html .}}"></script>{{end}}`
Использование пользовательской переменной (старый ответ)
Нашел один ответ через несколько минут после публикации.
Используя переменную, значение может быть передано в область range
:
const page = `{{$p := .Path}}{{range .Files}}<script src="{{html $p}}/js/{{html .}}"></script>{{end}}`