模板

最后更新于:2022-04-01 04:22:02

Revel 使用 [Go 模板](http://www.golang.org/pkg/text/template/), 在下面两个目录中查找模板: * 应用程序的 `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`](http://gorevel.cn/docs/docs/godoc/validation.html#Validation.ErrorMap) * “flash” - 上个请求flash的数据 ## 模板功能 Go 提供了一些 [模板函数](http://www.golang.org/pkg/text/template/#Functions)。Revel 也增加了一些模板函数。请阅读下面的文档 或 [查看源代码](http://gorevel.cn/docs/docs/godoc/template.html#variables). ### 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.](http://gorevel.cn/docs/docs/godoc/field.html) 例如: ~~~ {{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 } } ~~~
';