- 模板
- 渲染上下文
- 模板功能
- eq
- set
- append
- field
- option
- radio
- nl2br
- pluralize
- raw
- Including
- 温馨提示
- 自定义模板函数
模板
Revel 使用 Go 模板, 在下面两个目录中查找模板:
- 应用程序的
views
目录 (包括所有的子目录) - Revel的
templates
目录.
比如有一个控制器Hello
,方法名为World
, Revel 会查找名字为views/Hello/World.html
的模板。模板名字不区分大小写,所以views/hello/world.html
与views/HeLlO/wOrLd.HtMl
都是匹配的模板.
Revel 提供了错误页面模板 (在开发模式中友好的显示编译错误), 开发者也可以重写这些模板,比如 app/views/errors/500.html
.
渲染上下文
Revel 使用 RenderArgs map 渲染模板。除了开发者传送的数据, Revel 也提供一些有用的数据:
- “errors” - 验证错误(map,请参考文档
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 字段辅助函数.
给出一个字段名, 函数会生成包含下面成员的结构:
- Id: 字段Id, 转换为一个HTML字段的ID。
- Name: 字段名称
- Value: 当前上下文中字段的值
- Flash: 带回的字段值
- Error: 字段错误消息(如果有错误)
- ErrorClass: 原始的字符串 “hasError”, 如果没有错误就是一个 ””.
浏览 godoc.
例如:
{{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
字段。
例如:
{{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 input
字段
例如:
{{with $field := field "booking.Smoking" .}}
{{radio $field "true"}} Smoking
{{radio $field "false"}} Non smoking
{{end}}
nl2br
将换行符转换成 HTML 的 break.
例如:
You said:
<div class="comment">{{nl2br .commentText}}</div>
pluralize
一个辅助的复数函数
例如:
There are {{.numComments}} comment{{pluralize (len comments) "" "s"}}
raw
输出原生的、未转义的文本
例如:
<div class="body">{{raw .blogBody}}</div>
Including
Go 模板允许你在模板中包含其他模板,比如:
{{template "header.html" .}}
注意: * 相对路径是 app/views
温馨提示
Revel 应用程序有效利用 Go 模板,请看看下面的例子:
revel/samples/booking/app/views/header.html
revel/samples/booking/app/views/Hotels/Book.html
使用辅助函数,为模板设置标题和额外的样式。
例如:
<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() {
- revel.TemplateFuncs["eq"] = func(a, b interface{}) bool { return a == b }
- }