3.2.1 模板语法指南
最后更新于:2022-04-02 06:13:51
[TOC]
# beego 模板语法指南
本文讲述 beego 中使用的模板语法,与 go 模板语法基本相同。
## 基本语法
go 统一使用了 `{{` 和 `}}` 作为左右标签,没有其他的标签符号。如果您想要修改为其它符号,可以参考 [模板标签](http://beego.me/docs/mvc/view/view.md#%E6%A8%A1%E6%9D%BF%E6%A0%87%E7%AD%BE)。
使用 `.` 来访问当前位置的上下文
使用 `$` 来引用当前模板根级的上下文
使用 `$var` 来访问创建的变量
[more]
**模板中支持的 go 语言符号**
```
{{"string"}} // 一般 string
{{`raw string`}} // 原始 string
{{'c'}} // byte
{{print nil}} // nil 也被支持
```
**模板中的 pipeline**
可以是上下文的变量输出,也可以是函数通过管道传递的返回值
```
{{. | FuncA | FuncB | FuncC}}
```
当 pipeline 的值等于:
* false 或 0
* nil 的指针或 interface
* 长度为 0 的 array, slice, map, string
那么这个 pipeline 被认为是空
#### if ... else ... end
```
{{if pipeline}}{{end}}
```
if 判断时,pipeline 为空时,相当于判断为 False
```
this.Data["IsLogin"] = true
this.Data["IsHome"] = true
this.Data["IsAbout"] = true
```
支持嵌套的循环
```
{{if .IsHome}}
{{else}}
{{if .IsAbout}}{{end}}
{{end}}
```
也可以使用 else if 进行
```
{{if .IsHome}}
{{else if .IsAbout}}
{{else}}
{{end}}
```
#### range ... end
```
{{range pipeline}}{{.}}{{end}}
```
pipeline 支持的类型为 array, slice, map, channel
range 循环内部的 `.` 改变为以上类型的子元素
对应的值长度为 0 时,range 不会执行,`.` 不会改变
```
pages := []struct {
Num int
}{{10}, {20}, {30}}
this.Data["Total"] = 100
this.Data["Pages"] = pages
```
使用 `.Num` 输出子元素的 Num 属性,使用 `$.` 引用模板中的根级上下文
```
{{range .Pages}}
{{.Num}} of {{$.Total}}
{{end}}
```
使用创建的变量,在这里和 go 中的 range 用法是相同的。
```
{{range $index, $elem := .Pages}}
{{$index}} - {{$elem.Num}} - {{.Num}} of {{$.Total}}
{{end}}
```
range 也支持 else
```
{{range .Pages}}
{{else}}
{{/* 当 .Pages 为空 或者 长度为 0 时会执行这里 */}}
{{end}}
```
#### with ... end
```
{{with pipeline}}{{end}}
```
with 用于重定向 pipeline
```
{{with .Field.NestField.SubField}}
{{.Var}}
{{end}}
```
也可以对变量赋值操作
```
{{with $value := "My name is %s"}}
{{printf . "slene"}}
{{end}}
```
with 也支持 else
```
{{with pipeline}}
{{else}}
{{/* 当 pipeline 为空时会执行这里 */}}
{{end}}
```
#### define
define 可以用来定义自模板,可用于模块定义和模板嵌套
```
{{define "loop"}}
{{.Name}}
{{end}}
```
使用 template 调用模板
```
';
-
{{range .Items}}
{{template "loop" .}}
{{end}}