Как использовать Jade, как объявить класс тела в расширенном шаблоне?

Используя механизм шаблона Jade, я хочу, чтобы возможность необязательно объявлять классы тегам body, в шаблонах, которые расширяют другие.

layout.jade

!!! 5
html(lang='en')
head
    block title
    meta(charset='utf-8')
    link(rel='stylesheet', href='/stylesheets/style.css')
    block addhead

block body
    div#wrap
        header
            div#header_content
                p
                    a(href='/')
                        img(src='/images/logo.png', alt='Template-e-o')
            div.hr.red
        br(style='clear:both;')

        div#content
            block content
            br(style='clear:both;')

index.jade

extends layout

block title
    title bidi

block body
    body.index

block content
    p ’ello govna.

Это не работает.

Ответ 1

Хорошо, оператор block body представляет собой всего лишь блок с телом имени, поэтому в вашем макете не включен тэг body, он должен быть добавлен в index.jade(который вы пытаетесь сделать), Однако в вашем index.jade вы заменяете содержимое блока только телом body.index(который, я думаю, поскольку я не на своем компьютере-разработчике и не могу попробовать его прямо сейчас - делает ОК, но вынимает все контента, вы получаете только пустое тело, хотя оно должно иметь атрибут class= 'index).

Что вы можете попробовать, так это (в index.jade):

block prepend body
    body.index

Но я не уверен, что остальная часть вашего layout.jade(div # wrap) будет отображаться правильно под телом (я сомневаюсь).

Что бы я рекомендовал, если это действительно вопрос добавления условного класса в тело, это что-то вроде этого в layout.jade(вместо тела блока):

body(class=myClassLocalVar)

Где myClassLocalVar указан в вашем вызове .render(res.render('index', {myClassLocalVar: 'theClass'});). myClassLocalVar может быть даже массивом, и jade назначит все классы в массиве вашему телу.

Ответ 2

Jade поддерживает рубиноподобную интерпретацию строк

В вашем макете

- var bodyClass = '';
block vars
body(class='#{bodyClass}')
  block content

В ваших файлах просмотра

extends layout
block vars
  - var bodyClass = 'my-page';
block content
  p Hello World!

Ответ 3

Вы можете манипулировать переменными в родительской области, поэтому это решение также возможно:

В вашем макете

- var bodyClasses = [];
block beforeBody

body(class=bodyClasses)
  block content

В ваших файлах просмотра

extends layout
block beforeBody
  - bodyClasses.push('my-page')
block content
  p Hello World!

Это позволяет добавлять несколько классов на разные уровни вашего макета.