J'ai une mise en page Jade comportant un menu via une liste non ordonnée et je souhaite définir le <li>
sur <li class="active">...</li>
lorsque la page en cours est rendue dans le navigateur.
Je suppose que je devrai accéder à la requête en cours pour déterminer quand définir l'attribut sur le <li>
Je ne trouve aucun exemple sur la façon de procéder, alors j'espère que quelqu'un pourra vous aider
Merci
Essayez ceci avant votre appel res.render () sur votre route:
res.locals.path = req.path;
res.render('/page');
ou
res.render('/page', { path: req.path });
Ensuite, vous devrez faire un tas de déclarations if/else à votre avis (comme le suggère la solution ci-dessus).
- if(currentUrl === '/')
li(class='active')
a(href='/') Current Driver Standings
- else
li
a(href='/') Current Driver Standings
Cependant, je préfère le faire côté client, afin que mes fichiers modèles soient exempts de toute logique possible:
Dans le fichier de modèle de page (c'est ejs, vous ne savez pas comment faire écho en jade):
<body data-path="<%= path %>">
Ensuite, avec jQuery, vous pouvez récupérer le chemin du corps et attacher une classe active:
$(function(){
var path = $('body').attr('data-path');
$('nav li a[href='+path+']').parents('li').addClass('active');
});
Mise à jour: Vous pouvez également simplement utiliser var path = window.location.pathname
au lieu de l'enregistrer dans un attribut sur body
//no need to save path to <body> tag first:
$(function(){
var path = window.location.pathname;
$('nav li a[href='+path+']').parents('li').addClass('active');
});
Voici une façon bien plus pratique de le faire, côté serveur:
Dans votre routes.js
(ou ailleurs), définissez un tableau d'objets représentant votre système de navigation, par exemple:
var navLinks = [
{ label: 'Home', key: 'home', path: '' },
{ label: 'About', key: 'about', path: '/about' },
{ label: 'Contact', key: 'contact', path: '/contact' }
]
Passez la variable navLinks
à votre vue, ainsi que la clé de l'élément que vous souhaitez afficher en surbrillance:
res.render('home', { title: 'Welcome!', section: 'home', navLinks: navLinks });
Vous pouvez également ajouter la variable navLinks
à app.locals
et vous éviter de devoir la fournir explicitement aux vues.
Ensuite, dans votre modèle de jade, parcourez le tableau de liens et définissez la classe active sur celle dont la clé correspond à la section fournie:
ul(class='nav nav-list')
- navLinks.forEach(function(link){
- var isActive = (link.key == section ? 'active' : '')
li(class=isActive)
a(href=link.path)= link.label
- })
Passez le req.originalUrl dans votre fichier de routes. exemple: dans vos /routes/about.js
router.get('/', function(req, res) {
res.render('about', {
url: req.originalUrl
});
});
Ensuite, écrivez si condition sur votre modèle de jade
if(url==='/about-us')
li(class='active')
a(href='about-us') About Us
else
li
a(href='about-us') About Us
vous pouvez utiliser des variables globales dans app.js comme:
// Global vars
app.use( function ( req, res, next ) {
// rest of your code ...
res.locals.current_url = req.path;
// rest of your code ...
next();
} );
// then in your .jade file:
ul.navbar-nav.mr-auto
li(class="nav-item #{ current_url === '/page1' ? 'active' : ''}")
a.nav-link(href='/page1') Page1
comme cela, vous pouvez utiliser "current_url" globalement tout autour de vos fichiers de vue
Je suis venu avec ce qui fonctionne mais je ne suis pas sûr si sa meilleure pratique. Faites-moi savoir de toute façon:
response.render("current/currentSchedule", {
title: "Current Race Schedule",
currentUrl: req.path,
});
ul(class='nav nav-list')
li(class='nav-header') Current Season
- if(currentUrl === '/')
li(class='active')
a(href='/') Current Driver Standings
- else
li
a(href='/') Current Driver Standings
- if(currentUrl === '/constructor-standings')
li(class='active')
a(href='/constructor-standings') Current Constructor Standings
- else
li
a(href='/constructor-standings') Current Constructor Standings
- if(currentUrl === '/current-schedule')
li(class='active')
a(href='/current-schedule') Current Race Schedule
- else
li
a(href='/current-schedule') Current Race Schedule