模板渲染
Iris内置支持八个模板引擎,开发者仍然可以使用任何go语言外部模板引擎,因为Context.ResponseWriter()
是一个io.Writer
。
所有模板引擎共享一个公共的API,包括使用嵌入的资源进行解析、布局和Party-specific布局、模板函数、部分渲染等。
# | 名称 | 解析器 |
---|---|---|
1 | HTML | html/template |
2 | Blocks | kataras/blocks |
3 | Django | flosch/pongo2 |
4 | Pug | Joker/jade |
5 | Handlebars | aymerick/raymond |
6 | Amber | eknkc/amber |
7 | Jet | CloudyKit/jet |
8 | Ace | yosssi/ace |
可以为每个Party注册一个视图引擎。使用Application/Party.RegisterView(ViewEngine)
方法进行注册,示例如下:
从”./views”文件夹加载所有扩展名为”.html”的模板,并使用标准的html/template
包进行解析。
// [app := iris.New...]
tmpl := iris.HTML("./views", ".html")
app.RegisterView(tmpl)
在主要路由处理程序中使用Context.View
方法来渲染或执行一个视图。
if err := ctx.View("hi.html"); err!=nil {
ctx.HTML("%s", err.Error())
return
}
通过中间件或主处理程序使用Context.ViewData
方法在视图中将Go值与键值模式进行绑定。
将{{.message}}
与"Hello world!"
进行绑定。
ctx.ViewData("message", "Hello world!")
根绑定:
if err := ctx.View("user-page.html", User{}); err!=nil {
ctx.HTML("%s", err.Error())
return
}
// root binding as {{.Name}}
使用preferred view engine
的AddFunc
方法来添加模板函数。
// function名称,输入参数,返回值
tmpl.AddFunc("greet", func(s string) string {
return "Greetings " + s + "!"
})
如果要每次请求都重新加载,调用视图引擎的Reload
方法。
tmpl.Reload(true)
如果要使用嵌入的模板而不依赖于本地文件系统,请使用go-bindata外部工具,将其生成的AssetFile()
函数作为首个输入参数传递给preferred view engine
。
tmpl := iris.HTML(AssetFile(), ".html")
示例代码:
翻译结果:
// 文件: main.go
包 main
导入 "github.com/kataras/iris/v12"
func main() {
app := iris.New()
// 从 "./views" 文件夹解析所有后缀是 ".html" 的模板
// 使用标准的 `html/template` 包进行解析
tmpl := iris.HTML("./views", ".html")
// 设置自定义分隔符
tmpl.Delims("{{", "}}")
// 开启对本地模板文件变化的重新编译
tmpl.Reload(true)
// 默认的模板函数有:
//
// - {{ urlpath "myNamedRoute" "pathParameter_ifNeeded" }}
// - {{ render "header.html" . }}
// 以及到当前页面的相对路径:
// - {{ render_r "header.html" . }}
// - {{ yield . }}
// - {{ current }}
// 注册一个自定义模板函数:
tmpl.AddFunc("greet", func(s string) string {
return "问候 " + s + "!"
})
// 将视图引擎注册到应用中,
// 这样会加载模板。
app.RegisterView(tmpl)
// 方法: GET
// 资源: http://localhost:8080
app.Get("/", func(ctx iris.Context) {
// 将 {{.message}} 绑定到 "Hello world!"
ctx.ViewData("message", "Hello world!")
// 渲染模板文件: ./views/hi.html
if err := ctx.View("hi.html"); err != nil {
ctx.HTML("%s", err.Error())
return
}
})
app.Listen(":8080")
}
Hi 页面
{{.message}}
{{greet "to you"}}
在浏览器中打开一个新的选项卡访问 http://localhost:8080。
渲染的结果应该如下所示:
Hi 页面
Hello world!
问候 to you!