2

我的 _base.html 模板中有这个引导导航,如下所示:

<ul class="nav navbar-nav">
   <li><a href="/" class="">Home</a></li>
   <li><a href="/blog/">Blog</a></li>
</ul>

使用 Golang 我想添加一个

class="active"

到相应的列表项。

我已经阅读了html/template文档和类似thisone的文章,但在我看来,我必须编写一个 golang 函数来添加

class="active"

到每个对应的相应列表项。但不知何故,我仍然认为如果我可以添加类似的东西会更干净

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

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

4

3 回答 3

5

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

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

示例用法:

<li{{if eq .Active "index"}} class="active"{{end}}><a href="/">Home</a></li>

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

于 2013-08-21T11:34:37.247 回答
5

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

<ul>
  <li {{if eq .Active "info" }}class="active"{{end}}>
    <a href="/info">{{.User.Info}}</a>
  </li>
</ul>

现在用匿名结构渲染这个模板。

// 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)
于 2014-09-24T12:27:49.833 回答
0

我认为这就是你的情况。您可以根据您的确切用例稍微不同地重新制定它,例如:

type State struct {
    active string
}
func (s *State) Class(page string) {
    if s.active == page {
        return `class="active"`
    }
    return `class="notactive"` // Or whatever default case you want
}

tmplt = `
<ul class="nav navbar-nav">
    <li><a href="/" {{.Class "index"}}>Home</a></li>
    <li><a href="/blog/" {{.Class "blog"}}>Blog</a></li>
</ul>`

或者类似的东西,但if模板的重点正是允许这些东西。尽管您的 Go 代码将决定哪个页面处于活动状态,但您仍然必须将其传递给您的模板,而且我认为需要某种if语句(或像我上面所做的那样调用)来提取您传递的状态,即使它已经包含所有的信息。

于 2013-08-21T08:40:03.447 回答