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 に答える
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 に答える