一尘不染

调用带有多个管道参数的模板

go

在Go模板中,有时将正确的数据传递到正确的模板的方式令我感到尴尬。用流水线参数调用模板看起来就像只用一个参数调用函数。

假设我有一个Gophers网站,有关Gophers。它具有一个主页主模板和一个用于打印Gophers列表的实用程序模板。

http://play.golang.org/p/Jivy_WPh16

输出:

*The great GopherBook*    (logged in as Dewey)

    [Most popular]  
        >> Huey
        >> Dewey
        >> Louie

    [Most active]   
        >> Huey
        >> Louie

    [Most recent]   
        >> Louie

现在,我想在子模板中添加一些上下文:在列表内以不同的方式设置名称“
Dewey”的格式,因为它是当前登录用户的名称。但是我不能直接传递名称,因为只有一个可能的“点”参数管道!我能做什么?

  • 显然,我可以将子模板代码复制粘贴到主模板中(我不想这样做,因为它失去了拥有子模板的全部兴趣)。
  • 或者,我可以使用访问器来处理某种全局变量(我也不想这样做)。
  • 或者,我可以为每个模板参数列表创建一个新的特定结构类型(不是很好)。

阅读 248

收藏
2020-07-02

共1个答案

一尘不染

您可以在模板中注册一个“ dict”函数,该函数可用于将多个值传递给模板调用。调用本身将如下所示:

{{template "userlist" dict "Users" .MostPopular "Current" .CurrentUser}}

小“ dict”帮助程序的代码(包括将其注册为模板功能)在此处:

var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
    "dict": func(values ...interface{}) (map[string]interface{}, error) {
        if len(values)%2 != 0 {
            return nil, errors.New("invalid dict call")
        }
        dict := make(map[string]interface{}, len(values)/2)
        for i := 0; i < len(values); i+=2 {
            key, ok := values[i].(string)
            if !ok {
                return nil, errors.New("dict keys must be strings")
            }
            dict[key] = values[i+1]
        }
        return dict, nil
    },
}).ParseGlob("templates/*.html")
2020-07-02