2017-04-15 4 views
1

나는 템플릿 (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 }} 

이 경우 어떻게해야합니까?

+0

제발, 명확히 : 귀하의 질문은'텍스트/템플릿'에 대해 무엇입니까? 왜냐하면'text/tempate'는 중첩 된 템플리트 정의를 허용하기 때문입니다. – Ingaz

답변

4

템플릿 호출에 여러 개의 인수를 전달하는 내장 솔루션이 있는지 확실하지 않지만 인수가없는 경우에는 인수를 병합하여 단일 슬라이스 값으로 반환하는 함수를 정의 할 수 있습니다 , 그 함수를 등록하고 템플릿 호출에 사용할 수 있습니다.

뭔가처럼 : 당신의 index.html에서 다음

func args(vs ...interface{}) []interface{} { return vs } 
t, err := template.New("t").Funcs(template.FuncMap{"args":args}).Parse... 

, 당신은이 작업을 수행 할 것입니다 :

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

+0

'ParseFiles'와 함께 사용할 수 있습니까? – xhallix

+0

'ParseFiles','ParseGlob' ...은'Funcs' 메쏘드에 등록 된 func를 가지고있는 것처럼 템플리트를 어떻게 파싱하는지 상관 없습니다. 결과 템플릿은 그 func에 접근 할 수 있습니다. – mkopriva

+0

아직 등록되지 않은 func를 참조 할 수 없기 때문에'* Template.ParseFiles' 메소드가 아니라'template.ParseFiles' 함수를 의미한다면 ** no **를 사용하십시오. 그래서 먼저 template.New'로'template.Template'을 생성하고 사용할 함수를 등록한 다음 그 템플릿에'ParseFiles' 메쏘드를 호출해야합니다. – mkopriva

2

내장 기능이 없습니다. 당신은지도를 생성하는 기능을 추가하고 아이 템플릿에 그것을 사용할 수 있습니다

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

Run it in the playground

지도를 사용할 때의 이점은 인수가 "na med ". 다른 대답에서 설명한대로 슬라이스를 사용하면 코드가 훨씬 간단해진다는 이점이 있습니다.