我有像这样我的_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 /模板文件和类似物品thisone ,但在我看来,我必须写一个golang功能,增加了
class="active"
每correspondending相应的列表项。 但不知何故,我仍然认为这将是清洁的,如果我可以只添加类似
<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>
或类似的东西。 我记得罗布·派克说Golang应该为你做所有的计算,但为什么会出现一个“如果”语句在HTML /模板包?
我个人通常实现小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>
但仅使用它的显示逻辑本身。 这是一个很好的做法,以保持显示逻辑和分开的真正计算。
现在,你不必实现自己的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)
我认为这是你的情况的路要走。 您可以重新制定此略有不同取决于你的确切使用情况,例如:
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
语句(或称之为正如我上面做的)需要提取传递的状态,即使它已经包含了所有的信息。