基于加载模板CSS类(css class based on loaded template)

2019-10-18 12:47发布

我有像这样我的_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 /模板包?

Answer 1:

我个人通常实现小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>

但仅使用它的显示逻辑本身。 这是一个很好的做法,以保持显示逻辑和分开的真正计算。



Answer 2:

现在,你不必实现自己的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)


Answer 3:

我认为这是你的情况的路要走。 您可以重新制定此略有不同取决于你的确切使用情况,例如:

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语句(或称之为正如我上面做的)需要提取传递的状态,即使它已经包含了所有的信息。



文章来源: css class based on loaded template