2017-04-15 42 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/template'?因爲'text/tempate'允許嵌套的模板定義。 – Ingaz

回答

4

我不知道是否存在傳遞多個參數給模板調用,但是,如果一個內置的解決方案沒有一個,你可以定義合併它的參數和返回它們作爲一個單一的切片值的函數,那麼你可以註冊該函數並在模板調用中使用它。

喜歡的東西:

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

+0

是否可以使用'ParseFiles'? – xhallix

+0

'ParseFiles','ParseGlob' ......不要緊,你如何解析模板作爲多頭,你已經有了用'Funcs'方法註冊的FUNC,產生的模板將有機會獲得該FUNC。 – mkopriva

+0

如果你指的是功能'template.ParseFiles',而不是方法'* Template.ParseFiles'然後** **沒有,因爲你不能引用尚未註冊的FUNC。所以你需要先用'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」。在另一個答案中描述的使用切片的優點是代碼更簡單。