6.1 渲染模板
一旦你拥有一个模版文件,你可以通过给一个map来给它传递数据。
map是一个变量及赋予的值的集合,模板使用它来得到变量的值,或者对于块标签求值。
它的渲染函数有一个可选的变量键值对map
通过 ctx.Render()
方法来渲染模板,例如:
func (r *Render) Serve(ctx *faygo.Context) error {
return ctx.Render(200, "../_syso/index.tpl", faygo.Map{
"TITLE": "faygo",
"VERSION": faygo.VERSION,
"CONTENT": "Welcome To faygo",
"AUTHOR": "HenryLee",
})
}
注: 变量名必须以字母(A-Z或a-z)开始,可以包含数字,下划线,变量名大小写敏感。
6.1.1 变量查找
上面的例子中,我们给模板index.tpl传递了简单的值,大部分是string类型。
实际上模板系统还可以处理更复杂的数据结构,如slice、map和struct等,这时我们可以通过字符 .
来获取它们的成员
下面为通过 .
访问map value的示例:
func (r *Render) Serve(ctx *faygo.Context) error {
return ctx.Render(200, "static/_syso/index.html", faygo.Map{
"Date": map[string]string{"year": "2017", "month": "01", "day": "01"},
})
}
The month is {{ Date.month }} and the year is {{ Date.year }}. //The month is 01 and the year is 2017.
小数点也可以用来调用切片的索引:
func (r *Render) Serve(ctx *faygo.Context) error {
return ctx.Render(200, "static/_syso/index.html", faygo.Map{
"items": []string{"apples", "bananas", "carrots"},
})
}
Item 2 is {{ items.2 }}. //Item 2 is carrots.
总结一下,当模板系统遇到变量名里有小数点时会按以下顺序查找:
- 字典查找,如foo[“bar”]
- 属性查找,如foo.bar
- 方法调用,如foo.bar()
- 列表的索引查找,如foo[bar]
小数点可以多级纵深查询,例如 {{ person.name.upper }}
表示字典查询 person['name']
然后调用 upper()
方法
6.1.2 关于方法调用
方法调用要比其他的查询稍微复杂一点
例:
{% if helper_functions.is_server_online("florian-schlachter.de") %}Server is up!{% endif %}
{% if (check_access("admin", userprofile.username) && userprofile.is_verified()) || admin_happyhour %}
...
{% endif %}
{{ make_statuscode_verbose(user.lang, make_http_request(server.url, "/index.php").statuscode) }}
6.1.3 不合法的变量怎样处理
默认情况下如果变量不存在,模板系统会把它渲染成空string,例如:
func (r *Render) Serve(ctx *faygo.Context) error {
return ctx.Render(200, "static/_syso/index.html", faygo.Map{
"Name": "John",
})
}
Your name is {{ name }}. //Your name is .