模板文件默認存放在beego項目下的views目錄下,如果我們想要將模板文件換到另一個目錄時該如何操作那?
一、指定模板文件目錄的方法
方法一:
在main.go文件里,beego.Run()上方添加:beego.SetViewsPath("newpath"),指定模板文件路徑。
方法二:
在配置文件里設置:viewspath = "newpath",指定模板文件路徑。
二、添加模板文件支持其他結尾與管理模板渲染
2.1、添加模板文件支持其他結尾的模板
beego里默認支持 “.tpl和.html” 模板文件
設置模板支持其他后綴名:beego.AddTemplateExt("后綴名")
2.2、管理模板渲染
如果我們只是用beego寫接口,不需要渲染模板(如果既有接口又有模板就打開自動渲染),關閉模板渲染的兩種方法。
(1)在配置文件里管理渲染
autorender = false // 在配置文件關閉自動渲染
(2)在main.go里管理渲染
再main.go文件里beego.Run()上方添加如下配置關閉自動渲染: beego.BConfig.WebConfig.AutoRender = false
三、模板渲染
后端的數據想在前端模板文件里展示時需要將后端的數據傳遞給模板文件,然后再模板文件里使用特定的語法展示出來。
3.1、模板語法
(1)go統一使用 {{ 和 }} 作為左右標簽,也可以用下面的方法修改為其他的符號(不建議修改),修改后會有問題。
beego.BConfig.WebConfig.TemplateLeft = "((" beego.BConfig.WebConfig.TemplateRight = "))"
(2)使用 . 來訪問當前位置的上下文,示例如下
示例一:直接調用.name變量時.的上一級是后端傳過來的數據 {{.name}} 示例二:循環時的.與循環里的. {{for range .array}} --> 循環時.的上一級是后端傳過來的數據 {{.}} --> 循環里的.的上一級是外層循環的. {{end}}
(3)使用 $ 來引用當前模板根級的上下文,示例如下
{{range $i,$v := .array}} --> 循環時時.的上一級是后端傳過來的數據,此時$的上級是.($的作用域只限於當前模板) {{$i}} --> 此時$的上級是外層循環的$ {{$v}} {{end}}
(4)使用 "$." 引用模板中的根級上下文
{{for range .array}} --> 循環時.的上級是后端傳過來的數據 {{.}} --> 循環里.的上級是外層循環的. {{$.name}} --> $.的上級是后端傳過來的name數據("$."的上級直接是后端傳過來的數據,也叫根級數據。) {{end}}
3.2、beego模板里支持的符號
(1)字符串:beego模板里在雙引號里的是字符串類型的數據
{{"string"}}
(2)轉譯符:beego模板字符串里的單個\起到轉譯的功能
{{"\\string"}} --> 展示的結果是:\string,也就是說單個\在模板字符串里是轉譯的意思。
(3)原生字符串:原生字符串用``包着,``里面是啥得到的結果就是啥,``里面不支持轉譯
{{`\\string`}} --> 反引號里的是原生字符串,反引號里不支持轉義符號(即寫的啥展示的就是啥),展示結果為:\\string
(4)字節類型:在單引號里的值是字節類型(ascll碼)
{{'a'}} --> 單引號里的是字節類型(ascll碼),a對應的ascll碼的值為97,所以展示結果是97
(5)nil(空):beego模板里nil也表示空類型,nil類型模板不能直接渲染,需要借助模板自帶的函數print實現渲染,使用方法如下
{{print nil}} --> 展示結果是:<nil>,nil類型在模板上展示需要借助print方法(如果直接寫{{nil}}會報錯:nil is not a command)
(6)pipeline(管道):將管道前面的數據交給管道后面的方法處理,類似於linux下的管道(|)
{{"uxuan.cc"|len}} --> pipeline(類似linux的管道),將前面的數據交給后面的方法處理 注意:當出現如下情況時,pipeline認定為空: 1.false 或 0 2.nil的指針或interface 3.長度為0的array、slice、map、string
3.3、指定模板文件、傳數據給模板與模板渲染數據
(1)往模板里傳數據,示例如下(如果不指定模板文件只傳數據時啟動程序時會報錯):
func (c *IndexController) Get() { c.Data["Email"] = "admin@uxuan.cc" // 傳字符串類型的數據 c.TplName = "index.html" // 指定模板 }
(2)模板文件里渲染字符串類型數據,示例如下
<p>Email: {{.Email}}</p>
四、其他類型的數據傳遞與模板渲染
4.1、后端傳遞數據
func (c *TestController) Get() { // 1.字符串渲染 c.Data["Website"] = "uxuan.cc" c.Data["Email"] = "dream@uxuan.cc" // 2.結構體渲染 user := UserStruct{ Id: 1, Name: "Dream", Age: 22, } c.Data["User"] = user // 3.數組渲染 var arrs = [5]int{9,7,8,5,3} c.Data["Arrs"] = arrs // 4.數組結構體渲染 arr_struct := [4]UserStruct{{Id: 1, Name: "Dream", Age: 22,}, {Id: 2, Name: "Dream", Age: 22,},{Id: 3, Name: "Dream", Age: 22,}, {Id: 4, Name: "Dream", Age: 22,}} c.Data["ArrStruct"] = arr_struct // 5.map渲染 testMap := map[string]string{"Name": "Dream", "Class": "Go語言開發", "Sex": "man",} c.Data["maps"] = testMap // 6.結構體map渲染 structMap := make(map[int]UserStruct) structMap[1] = UserStruct{Id: 1, Name: "Dream", Age: 22} structMap[2] = UserStruct{Id: 2, Name: "Dream2", Age: 22} structMap[3] = UserStruct{Id: 3, Name: "Dream3", Age: 22} c.Data["MapStruct"] = structMap // 7.切片渲染 var slices = []int{1,3,5,7,9} c.Data["Slices"] = slices c.TplName = "index.html" }
4.2、模板里渲染數據
<!DOCTYPE html> <html> <head> <title>Beego</title> </head> <body> <!--結構體渲染--> <h1>數據渲染</h1> <h3>1.字符串渲染</h3> <p>網址: {{.Website}}</p> <p>郵箱: {{.Email}}</p> <br> <h3>2.結構體渲染</h3> <p>ID:{{.User.Id}}</p> <p>用戶名:{{.User.Name}}</p> <p>年齡:{{.User.Age}}</p> <br> <h3>3.數組渲染</h3> <h5>3.1: 循環數組 - 方法1</h5> {{range .Arrs}} {{.}} {{end}} <h5>3.2: 循環數組 - 方法2</h5> {{range $i, $v := .Arrs}} index: {{$i}} value: {{$v}} {{end}} <br> <h3>4.數組結構體渲染</h3> <h5>4.1: 循環數組結構體方法1</h5> {{range .ArrStruct}} {{.Id}} {{.Name}} {{.Age}} {{end}} <br> <h5>4.2: 循環數組結構體方法2</h5> {{range $v := .ArrStruct}} <!-- 留$i, $v時:i是下標,v是變量值,留$v時默認v獲取的是變量值 --> {{$v.Id}} {{$v.Name}} {{$v.Age}} {{end}} <br> <h3>5.map渲染</h3> <h5>5.1: map單個字段渲染</h5> {{.maps.Name}} {{.maps.Class}} {{.maps.Sex}} <br> <h5>5.2: 循環方式1循環map</h5> {{range .maps}} {{.}} {{end}} <br> <h5>5.3: 循環方式2循環map</h5> {{range $k,$v := .maps}} {{$k}}: {{$v}}<br> {{end}} <br> <h3>6.結構體map渲染</h3> {{range $k, $v := .MapStruct}} {{$k}}: {{$v}} - ID: {{$v.Id}}, Name: {{$v.Name}}, Age: {{$v.Age}}<br> {{end}} <br> <h3>7.切片渲染</h3> <h5>7.1: 循環切片1</h5> {{range .Slices}} {{.}} {{end}} <br> <h5>7.2: 循環切片2</h5> {{range $i, $v := .Slices}} index: {{$i}} value: {{$v}} <br> {{end}} </body> </html>
4.3、展示結果
五、模板里的基本邏輯
5.1、模板里判斷 ”大於、小於、等於、大於等於、小於等於“ 方法
beego模板里沒有><=等方法,需要使用下面的方法判斷大小。
- eq:等於
- ne:不等於
- gt:大於
- ge:大於等於
- lt:小於
- le:小於等於
使用方法示例:
1、等於判斷 {{eq 3 5}} --> 結果為false(因為3不等於5,表達式不成立) 2、不等於判斷 {{ne 3 5}} --> 結果為true(因為3不等於5,表達式成立) 3、多個參數之間判斷 {{eq 3 4 5 3}} --> 結果是true(多個參數判斷時,每兩個參數都會判斷一次,只要有兩個參數相等表達式就成立) {{eq 3 4 5 6}} --> 結果是false
5.2、模板里的if判斷
示例一:進入某場館需要年滿十八歲,同時需要辦理vip才可以進入,下面的兩個判斷實現了年滿十八和是否是vip的判斷:
{{if ge .age 18}} --> 判斷后端傳過來的數據age是否大於等於18,大於等18執行這里 年齡大於18周歲 {{if eq .is_vip 1}} --> 判斷后端傳過來的數據is_vip是不是等於1,等於1執行這里 歡迎光臨,最貴的vip。 {{else}} --> 后端傳過來的數據is_vip不等於1執行這里 歡迎光臨,你還不是vip,請辦理會員。 {{end}} --> 中間的if判斷的結尾,每個if判斷都需要有{{end}}結尾 {{else}} --> 后端傳過來的數據age不大於等於18執行這里 年齡不滿18周歲 {{end}} --> 第一個判斷的結尾,每個if判斷都需要有{{end}}結尾
5.3、range循環
示例一:
{{range .array}}
{{.}}
{{end}}
示例二:
{{range $i,$v := .array}}
{{$i}}
{{$v}}
{{end}}
示例三:range和else結合使用
{{range .array}} {{.}} {{else}} --> 如果range循環的數組是空的或者長度為0時就會執行{{else}}里的內容 <p>空的數組</p> {{end}}
5.4、with方法使用
方法一:
1、前面我們介紹的結構體類型渲染方法如下: {{.struct_data.Id}} {{.struct_data.Name}} {{.struct_data.Age}} 2、使用with方法渲染結構體: {{with .struct_data}} {{.Id}} {{.Name}} {{.Age}} {{end}}
方法二、with和else結合使用
{{with .name1}} {{.}} {{else}} --> 當前面的結果沒有值時執行{{else}}里的操作 <p>沒有這個屬性值</p> {{end}}
5.5、template模板引用
在一個模板里引用另一個模板文件,示例如下:
示例一:引用模板文件
1.定義被引用的模板名字為:template1.html 2.在index.html里使用如下方法引用template1.html模板 {{template "template1.html" .}}
說明:
- template:固定語法
- "template1.html":引用的模板文件(這樣寫表示兩個模板文件是同一級目錄)
- . :上下文,后端傳的數據只傳入當前模板文件里了,被引用的模板文件如果需要獲取上下文時第三個參數.就不能少,少了.被引用的模板文件就無法獲取后端傳過來的數據了。
示例二:使用define自定義模板格式,然后template引用模板格式
1.在同一文件里定義模板格式 {{define "ul_li"}} --> 定義的模板格式名字為:ul_li,定義的模板格式是不顯示的 <ul><li>{{.name}}</li></ul> <ul><li>{{.age}}</li></ul> {{end}} 2.在同一文件里引用模板格式 {{template "ul_li" .}} --> 定義的模板格式需要用template引用時才會展示,三個參數和模板引用的參數一樣