Revel 使用 Go Templates. 它搜索兩個目錄來查找模板:
- 應用程序的 views 目錄和全部子目錄
- Revel自己的 Templates 目錄
Revel為錯誤頁面提供模板(在開發模式中顯示友好的編譯錯誤), 但是應用程序可以通過創建一個相同名字的模板來重寫它, 例如 app/views/errors/500.html
渲染上下文
Revel使用RenderArgs的數據字典執行模板. 除了應用程序提供的數據外, Revel提供了下面的入口:
- "errors" -
Validation.ErrorMap 返回的字典 - "flash" - 前一個請求的flash數據
模板函數
Go提供了一些模板函數用於你的模板中. Revel添加了如下這些, 你可以查看文檔或源代碼.
eq
一個簡單的 "a== b"測試, 如下所示:
<div class="message {{if eq .User "you"}}you{{end}}">
set
設置一個變量到給定的上下文, 如下所示:
{{set . "title" "Basic Chat room"}}
<h1>{{.title}}</h1>
append
添加一個變量到一個數組或開始一個新數組到給定的上下文, 如下所示:
{{append . "moreScripts" "js/jquery-ui-1.7.2.custom.min.js"}}
{{range .moreStyles}}
<link rel="stylesheet" type="text/css" href="/public/{{.}}">
{{end}}
field
一個input元素的幫助函數.
給定一個元素名稱, 它返回一個包含了下面成員的struct
- Id: 元素名稱, 轉換成一個適當的html元素的ID.
- Name: 元素名稱
- Value: 元素在當前RenderArgs的值
- Flash: 元素的falsh值
- Error: 錯誤信息,任何與這個元素相關的錯誤信息
- ErrorClass: 如果這里有一個錯誤為字面量字符串"error", 否則為""
{{with $field := field "booking.CheckInDate" .}}
<p class="{{$field.ErrorClass}}">
<strong>Check In Date:</strong>
<input type="text" size="10" name="{{$field.Name}}" class="datepicker" value="{{$field.Flash}}">
* <span class="error">{{$field.Error}}</span>
</p>
{{end}}
option
協助構造HTML的option元素, 結合field幫助函數, 如下所示:
{{with $field := field "booking.Beds" .}}
<select name="{{$field.Name}}">
{{option $field "1" "One king-size bed"}}
{{option $field "2" "Two double beds"}}
{{option $field "3" "Three beds"}}
</select>
{{end}}
radio
協助構建HTML的radio元素, 結合field幫助函數, 如下所示:
{{with $field := field "booking.Smoking" .}}
{{radio $field "true"}} Smoking
{{radio $field "false"}} Non smoking
{{end}}
包含
Go模板允許你通過包含來組建模板, 如下所示:
{{include "header.html"}}
這里有兩件需要注意的事:
- 路徑是相對的 app/views
- 任何被包含的模板必須在根目錄下(app/views). 這是一個(希望是臨時的)限制
技巧
這個示例演示了Revel嘗試有效的使用Go模板. 如下所示:
revel/samples/booking/app/views/header.htmlrevel/samples/booking/app/views/Hotels/Book.html
它利用幫助函數來在模板中設置title和額外的樣式, header示例如下:
<html>
<head>
<title>{{.title}}</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" type="text/css" media="screen" href="/public/css/main.css">
<link rel="shortcut icon" type="image/png" href="/public/img/favicon.png">
{{range .moreStyles}}
<link rel="stylesheet" type="text/css" href="/public/{{.}}">
{{end}}
<script src="/public/js/jquery-1.3.2.min.js" type="text/javascript" charset="utf-8"></script>
<script src="/public/js/sessvars.js" type="text/javascript" charset="utf-8"></script>
{{range .moreScripts}}
<script src="/public/{{.}}" type="text/javascript" charset="utf-8"></script>
{{end}}
</head>
模板包含它看起來像這樣
{{set . title "Hotels"}}
{{append . "moreStyles" "ui-lightness/jquery-ui-1.7.2.custom.css"}}
{{append . "moreScripts" "js/jquery-ui-1.7.2.custom.min.js"}}
{{template "header.html" .}}
自定義函數
應用程序可以在模板中注冊使用自定義函數, 示例如下:
func init() { rev.TemplateFuncs["eq"] = func(a, b interface{}) bool { return a == b } }
至此結束.
