sipin / gorazor

Razor view engine for go

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

请教gorazor模板几个基本问题: 作用域传递

smithfox opened this issue · comments

衡量一个模板是否好用,非 Hello World 所能反映出来的,必须在深入使用,才能体会。
我在实际使用go template 时遇到几个问题,想问问 gorazor 是什么解决的。

我都是基于 golang template 来说的.

  1. 作用域传递问题
    parent.tpl:
  {{range .Students}}
  {{template "child" .}}
  {{end}}
  <img src="{{$.CDN}}{{.Logo}}">

child.tpl:

  <p>{{.Name}}</p>
  <img src="{{$.CDN}}{{.Pic}}">

xx.go

  if request.URL == "" {
      m.CDN = "http://cdn.xxx.com"
  } else {
      m.CDN = ""
  }

  m.Logo = "/pics/logo.png"
  m.Students = []Students{{Name:"smith","Pic":"/pics/smith.jpg"},{Name:"fox","Pic":"/pics/fox.jpg"}}
  render("parent.tpl", m)

具体问题: child.tpl 的 {{$.CDN}} 会报错。
本质问题: 子模板被引用后,内部的最高作用域 root 是parent传入的变量,但实际应用还需要 glob 这样的作用域

基于go template我能想到的解决方法都有问题:

  1. 无论多少级的引用都传 . ,保证每层的tpl的root实际是 glob,但大大减低了 复用
  2. 不在模板解决,而在代码层解决,但这个func必须带入 http 上下文,不是一个 util function

gorazor的模板需要显示指定它接受的model,也就是说child.tpl如果需要用到{{$.CDN}},那么它必须在first code block中指定$.CDN的引用,而parent.tpl也必须显示的传递 $.CDN进去。

这样有时其实挺麻烦的。

在我们实际项目中,其实引入了一些变量的隐式传递,比方说 e8afcf3 这个gorazor的分支便会隐含的传递一个ctx变量到各个模板。