基于加载模板的css类

Dan*_*ani 1 css go go-html-template

我在我的_base.html模板中有这样的bootstrap导航,如下所示:

<ul class="nav navbar-nav">
   <li><a href="/" class="">Home</a></li>
   <li><a href="/blog/">Blog</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

使用Golang我想添加一个

class="active"
Run Code Online (Sandbox Code Playgroud)

到相应的列表项.

我读过的HTML /模板文件和类似物品thisone,但在我看来,我必须写一个golang功能,增加了

class="active"
Run Code Online (Sandbox Code Playgroud)

到每个对应的相应列表项.但不知怎的,我觉得如果我能添加类似的东西会更清洁

<ul>
    <li{{ if .template = "index.html" }} class="active"{{ end }}><a href="/">Home</a></li>
    <li{{ if .template = "blog.html" }} class="active"{{ end }}><a href="/blog/">Blog</a></li>
</ul>
Run Code Online (Sandbox Code Playgroud)

或类似的东西.我记得Rob Pike说Golang应该为你做所有的计算,但为什么html/template-package中有一个"if"语句?

tux*_*21b 5

我个人经常eq为这样的任务实现一个小助手:

var tmpl = template.Must(template.New("").Funcs(template.FuncMap{
    "eq": func(a, b interface{}) bool {
        return a == b
    },
}).ParseGlob("templates/*.html")
Run Code Online (Sandbox Code Playgroud)

用法示例:

<li{{if eq .Active "index"}} class="active"{{end}}><a href="/">Home</a></li>
Run Code Online (Sandbox Code Playgroud)

但仅将其用于显示逻辑本身.将显示逻辑和实际计算分开是一个很好的做法.


zem*_*rco 5

如今,您不必实现自己的eq助手。它已经包含在模板包中。

<ul>
  <li {{if eq .Active "info" }}class="active"{{end}}>
    <a href="/info">{{.User.Info}}</a>
  </li>
</ul>
Run Code Online (Sandbox Code Playgroud)

现在使用匿名结构呈现此模板。

// get template from file
view := template.Must(template.ParseFiles(
  "views/info.html",
  "views/layout.html",
))

// render template with data in route handler
data := struct {
  User   *User  // some custom struct with further details
  Active string
}{
  user,  // a User instance
  "info",
}
err = view.ExecuteTemplate(w, "layout", data)
check(err)
Run Code Online (Sandbox Code Playgroud)