【问题标题】:Golang templates for web applicationWeb 应用程序的 Golang 模板
【发布时间】:2016-11-10 12:11:14
【问题描述】:

我正在用 GoLang 编写一个 Web 应用程序,没有使用任何框架。

例如,我正在尝试创建一个类似于 nodejs 中的布局的layout

=== layout.html ====

 {{ define "layout"}}
 <!DOCTYPE html>
 <html>
  <head>
  <meta charset='utf-8'>
    <link href="/static/style.css" rel="stylesheet" media="all" type="text/css">
   </head>
   <body>
     {{ template "content"}}
   </body>
</html>

{{ end }}

然后我在 home.html 中有一些内容

{{ define "content"}}
    <h1>{{.Title}}</h1>
    <div>This is a test</div>
{{ end }}

我对这种方法有 2 个问题

(1)我的执行模板代码,似乎没有将数据传递给内容

templates.ExecuteTemplate(w, "layout", &Page{Title: "Home", Body: nil})

(2) 如果我想拥有多个具有相同布局的页面,上述将不起作用,因为它没有指定要加载的内容。

有人可以解释一下在 GoLang 中使用 tempates 和“布局”的策略吗?

【问题讨论】:

标签: go go-templates


【解决方案1】:

(1) 我的执行模板代码,似乎没有将数据传递给内容

正如人们在 cmets 中指出的那样,您需要使用数据显式调用模板:

{{ template "content" . }}

注意"content" 部分后面的点。

(2) 如果我想拥有多个具有相同布局的页面,上述将不起作用,因为它没有指定要加载的内容。

有几种方法可以解决这个问题。我要做的就是这个。我不在每个模板中都{{ define "content" }}。相反,我将所有模板解析为一个:

tmpls, err := template.ParseGlob(tmplGlob)

然后对于每个请求,我克隆布局并将所需的模板设置为"content"

func executeTemplate(tmpls *template.Template, tmplName string, w io.Writer, data interface{}) error {
    var err error
    layout := tmpls.Lookup("layout.html")
    if layout == nil {
        return errNoLayout
    }

    layout, err = layout.Clone()
    if err != nil {
        return err
    }

    t := tmpls.Lookup(tmplName)
    if t == nil {
        return errNoTemplate
    }

    _, err = layout.AddParseTree("content", t.Tree)
    if err != nil {
        return err
    }

    return layout.Execute(w, data)
}

【讨论】:

    【解决方案2】:

    (2) 如果我想拥有多个具有相同布局的页面,上述将不起作用,因为它没有指定要加载的内容。

    您需要为此构建一些东西。

    它可以是template func,它知道模板,接收块名称和参数来调用 t.executeTemplate,就像你做的那样。

    但是这种方法有一个严重的缺点,因为它要求每个请求都生成自己的编译模板。

    它可以是视图参数的方法。它可以让你构建一次模板,为每个请求重新使用这个实例,只有参数会改变。

    无论如何,如果你继续使用内置的template helper 它不能是一个变量,它被锁定为只能使用静态字符串。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-08
      • 2011-09-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-21
      • 1970-01-01
      • 2011-10-04
      相关资源
      最近更新 更多