首页 文章 beego——模板语法
go统一使用{{和}}作为左右标签,没有其它的标签符号。
使用"."来访问当前位置的上下文,使用"$"来引用当前模板根级的上下文,使用$var来访问创建的变量。
1 2 3 4 | {{"string"}} // 一般 string{{`raw string`}} // 原始 string{{'c'}} // byte{{print nil}} // nil 也被支持 |
可以是上下文的变量输出,也可以是函数通过管道传递的返回值。
1 | {{. | FuncA | FuncB | FuncC}} |
当pipeline的值等于:
false或0
nil的指针或interface
长度为0的array、slice、map、string
那么这个pipeline被认为是空。
1 | {{if pipeline}}{{end}} |
if判断时,pipeline为空时,相当于判断为False
1 2 3 | this.Data["IsLogin"] = truethis.Data["IsHome"] = truethis.Data["IsAbout"] = true |
支持嵌套的循环
1 2 3 4 | {{if .IsHome}}{{else}} {{if .IsAbout}}{{end}}{{end}} |
也可以使用else if进行
1 2 3 4 | {{if .IsHome}}{{else if .IsAbout}}{{else}}{{end}} |
1 | {{range pipeline}}{{.}}{{end}} |
pipeline 支持的类型为 array, slice, map, channel
range 循环内部的 . 改变为以上类型的子元素
对应的值长度为 0 时,range 不会执行,. 不会改变
1 2 3 4 5 6 | pages := []struct { Num int}{{10}, {20}, {30}}this.Data["Total"] = 100this.Data["Pages"] = pages |
使用 .Num 输出子元素的 Num 属性,使用 $. 引用模板中的根级上下文
1 2 3 | {{range .Pages}} {{.Num}} of {{$.Total}}{{end}} |
使用创建的变量,在这里和 go 中的 range 用法是相同的。
1 2 3 | {{range $index, $elem := .Pages}} {{$index}} - {{$elem.Num}} - {{.Num}} of {{$.Total}}{{end}} |
range 也支持 else
1 2 3 4 | {{range .Pages}}{{else}} {{/* 当 .Pages 为空 或者 长度为 0 时会执行这里 */}}{{end}} |
1 | {{with pipeline}}{{end}} |
with 用于重定向 pipeline
1 2 3 | {{with .Field.NestField.SubField}} {{.Var}}{{end}} |
也可以对变量赋值操作
1 2 3 | {{with $value := "My name is %s"}} {{printf . "slene"}}{{end}} |
with 也支持 else
1 2 3 4 | {{with pipeline}}{{else}} {{/* 当 pipeline 为空时会执行这里 */}}{{end}} |
define 可以用来定义自模板,可用于模块定义和模板嵌套
1 2 3 | {{define "loop"}} <li>{{.Name}}</li>{{end}} |
使用 template 调用模板
1 2 3 4 5 | <ul> {{range .Items}} {{template "loop" .}} {{end}}</ul> |
1 | {{template "模板名" pipeline}} |
将对应的上下文 pipeline 传给模板,才可以在模板中调用
1 | {{template "path/to/head.html" .}} |
Beego 会依据你设置的模板路径读取 head.html
在模板中可以接着载入其他模板,对于模板的分模块处理很有用处
允许多行文本注释,不允许嵌套
1 2 | {{/* comment contentsupport new line */}} |
变量可以使用符号|在函数间传递
1 2 | {{.Con | markdown | addlinks}}{{.Name | printf "%s"}} |
使用括号
1 | {{printf "nums is %s %d" (printf "%d %d" 1 2) 3}} |
1 | {{and .X .Y .Z}} |
and 会逐一判断每个参数,将返回第一个为空的参数,否则就返回最后一个非空参数
1 | {{call .Field.Func .Arg1 .Arg2}} |
call 可以调用函数,并传入参数
调用的函数需要返回 1 个值 或者 2 个值,返回两个值时,第二个值用于返回 error 类型的错误。返回的错误不等于 nil 时,执行将终止。
index 支持 map, slice, array, string,读取指定类型对应下标的值
1 2 | this.Data["Maps"] = map[string]string{"name": "Beego"}{{index .Maps "name"}} |
1 | {{printf "The content length is %d" (.Content|len)}} |
返回对应类型的长度,支持类型:map, slice, array, string, chan
not 返回输入参数的否定值,if true then false else true
1 | {{or .X .Y .Z}} |
or 会逐一判断每个参数,将返回第一个非空的参数,否则就返回最后一个参数
对应 fmt.Sprint
对应fmt.Sprintf
对应fmt.Sprintf
1 | {{urlquery "http://beego.me"}} |
将返回
1 | http%3A%2F%2Fbeego.me |
这类函数一般配合在 if 中使用
eq: arg1 == arg2ne: arg1 != arg2lt: arg1 < arg2le: arg1 <= arg2gt: arg1 > arg2ge: arg1 >= arg2
eq 和其他函数不一样的地方是,支持多个参数,和下面的逻辑判断相同
1 | arg1==arg2 || arg1==arg3 || arg1==arg4 ... |
与 if 一起使用
1 2 | {{if eq true .Var1 .Var2 .Var3}}{{end}}{{if lt 100 200}}{{end}} |