2013-08-21 4 views
1

Я получил эту самозагрузки СЧА в моем шаблоне _base.html как это:класс CSS на основе загруженного шаблона

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

каждому 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> 

или что-то в этом роде. Я помню, как Роб Пайк говорил, что Голанг должен делать все вычисления для вас, но почему в пакете html/template-package есть оператор if?

ответ

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> 

Но использовать его только для самой логики отображения. Хорошая практика заключается в том, чтобы разделить логику отображения и реальное вычисление.

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 решит, что страница WHICH активна, вам все равно нужно передать ее в свой шаблон, и я думаю, что какой-то оператор if (или звонок, как я сделал выше) требуется для извлечения состояния, которое вы проходите, хотя он уже содержит всю информацию.

2

В настоящее время вам не нужно реализовывать свой собственный помощник eq. Он уже включен в пакет template.

<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) 
Смежные вопросы