2013-08-21 4 views
1

J'ai ce nav bootstrap dans mon modèle de _base.html comme ceci:classe css basée sur modèle chargé

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

En utilisant golang Je veux ajouter un

class="active" 

à la liste correspondante -article.

J'ai lu les html/template docs et des articles comme thisone, mais il me semble que je dois écrire une fonction golang qui ajoute

class="active" 

à chaque correspondending élément de liste correspondant. Mais de toute façon, je pense que ce serait plus propre si je pouvais ajouter quelque chose comme

ou quelque chose comme ça. Je me souviens Rob Pike dire golang devrait faire tous les calculs pour vous, mais pourquoi est-il un « si » dans le code HTML/template-package?

Répondre

5

je mets en œuvre personnellement souvent une petite eq aide pour des tâches telles que:

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

Exemple d'utilisation:

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

Mais ne l'utilise que pour la logique d'affichage lui-même. C'est une bonne pratique de garder la logique d'affichage et le vrai calcul à part.

0

Je pense que c'est la voie à suivre dans votre cas. Vous pouvez reformuler légèrement différemment selon votre cas précis d'utilisation tels que:

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

Ou quelque chose dans ce sens, mais le point de if dans les modèles est précisément pour permettre ce genre de choses. Bien que votre code Go décidera quelle page est active, vous avez encore de le transmettre à votre modèle, et je pense une sorte de déclaration if (ou appelez comme je l'ai fait ci-dessus) est nécessaire pour extrait l'état que vous passez, même si il contient déjà toutes les informations.

2

De nos jours vous n'avez pas à mettre en œuvre votre propre aide eq. Il est déjà inclus dans le package template.

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

Rendez maintenant ce modèle avec une structure anonyme.

// 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) 
Questions connexes