Go Revel - Templates(模板)

revel使用Go官方的模板库。它会在两个目录查找模板文件:

1、应用的views目录以及它的所有子目录

2、revel库自己的templates目录

revel为错误页面提供了模板(在dev开发模式下,编译错误会更友好的显示),但是,如果用相同的名字创建一个模板,revel则会优先使用自己开发的模板。如 app/views/errors/500.html

渲染内容

revel使用RenderArgs数据map来执行模板。除了从应用提供数据,revel也提供了:

1、“errors”, 从Validation.ErrorMap返回的错误信息

2、“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}}

{{end}}

field

对Input表单字段进行操作。

给定一个字段名称,它将返回一个包含下列成员的struct:

Id: 字段名,会转换为恰当的HTML id元素

Name: 字段名

Value: RenderArgs中当前字段的值

Flash: 当前字段的flash信息

Error: 任何一个与当前字段有关的错误信息

ErrorClass: hasError的原始信息,如果不存在则为空字符串

{{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

结合field模板函数生成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

结合field模板函数生成HTML radio元素

{{with $field := field "booking.Smoking" .}}
  {{radio $field "true"}} Smoking
  {{radio $field "false"}} Non smoking
{{end}}

nl2br

生成HTML的换行标签

You said:
<div class="comment">{{nl2br .commentText}}</div>

pluralize

转换单词的复数形式

There are {{.numComments}} comment{{pluralize (len comments) "" "s"}}

Including

Go允许将一个模板嵌入至另一个模板

{{template "header.html" .}}

有两点需要注意:

1、路径必须是app/views的相对路径

2、任何被嵌入的模板必须位于app/views目录的根位置(这个限制希望是暂时的)

Tips

revel的示例程序说明了如何有效的使用模板,请特别留意这两个示例:

revel/samples/booking/app/views/header.html

revel/samples/booking/app/views/header.html

它利用模板函数设置模板自己的html header和样式:

        <title>{{.title}}</title>



        {{range .moreStyles}}

        {{end}}


        {{range .moreScripts}}

        {{end}}

引用html header模板:

{{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" .}}

自定义模板函数

revel应用可以注册自定义模板函数:

func init() {
    revel.TemplateFuncs["eq"] = func(a, b interface{}) bool { return a == b }
}</div>

posted on   黑暗伯爵  阅读(2200)  评论(0编辑  收藏  举报

编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示