Подтвердить что ты не робот

Доступ к текущему запросу в режиме Express/Jade

У меня есть представление Jade, которое имеет меню через неупорядоченный список, и я хочу установить <li> как <li class="active">...</li>, когда текущая страница отображается в браузере.

Я предполагаю, что мне нужно будет получить доступ к текущему запросу, чтобы определить, когда устанавливать атрибут на <li>

Я не могу найти примеров того, как это сделать, поэтому надеемся, что кто-то сможет помочь

Спасибо

4b9b3361

Ответ 1

Попробуйте это до вашего вызова res.render() на вашем маршруте:

res.locals.path = req.path;
res.render('/page');

или

res.render('/page', { path: req.path });

Тогда вам нужно будет сделать кучу утверждений if/else в вашем представлении (как предлагает вышеприведенное решение).

- if(currentUrl === '/')
    li(class='active')
        a(href='/') Current Driver Standings
- else
    li
        a(href='/') Current Driver Standings

Однако я предпочитаю делать это на стороне клиента, чтобы файлы моих шаблонов были свободны от максимально возможной логики:

В файле шаблона страницы (это ejs, не уверен, как эхо в нефрите):

<body data-path="<%= path %>">

Затем с помощью jQuery вы можете захватить путь из тела и присоединить активный класс:

$(function(){
    var path = $('body').attr('data-path');
    $('nav li a[href='+path+']').parents('li').addClass('active');
});

Обновление: Вы также можете просто использовать var path = window.location.pathname вместо сохранения его в атрибуте 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');
});

Ответ 2

Здесь гораздо более простой способ сделать это, серверная сторона:

В вашем routes.js (или везде) определите массив объектов, представляющих ваш навигатор, например:

var navLinks = [
  { label: 'Home', key: 'home', path: '' },
  { label: 'About', key: 'about', path: '/about' },
  { label: 'Contact', key: 'contact', path: '/contact' }
]

Передайте переменную navLinks в свой вид, а также ключ элемента, который вы хотели бы высветить:

res.render('home', { title: 'Welcome!', section: 'home', navLinks: navLinks });

Вы также можете добавить переменную navLinks в app.locals и сохранить ее, всегда предоставляя ее явно представлениям.

Затем в вашем шаблоне шаблона jade через массив ссылок и установите активный класс на том, чей ключ соответствует предоставленному разделу:

ul(class='nav nav-list')
  - navLinks.forEach(function(link){
    - var isActive = (link.key == section ? 'active' : '')
    li(class=isActive)
      a(href=link.path)= link.label
  - })

Ответ 3

Передайте req.originalUrl в файле маршрутов. пример: в вашем  /routes/about.js

router.get('/', function(req, res) {
 res.render('about', { 
  url: req.originalUrl
 });
});

Затем напишите, если условие else на вашем шаблоне нефрита

    if(url==='/about-us')
     li(class='active')
      a(href='about-us') About Us
    else
     li
      a(href='about-us') About Us

Ответ 4

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

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