Макеты шаблонов Jade не работают в сочетании с Node.js - программирование
Подтвердить что ты не робот

Макеты шаблонов Jade не работают в сочетании с Node.js

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

Вот что у меня есть:

main.js

var express = require('express');

var app = express.createServer();

app.set('views', __dirname + '/views'); 
app.set('view engine','jade');
app.set('view options', {
 layout: true
});

app.get('/', function(req,res) {
res.render('index', { title: 'My site' });
});

app.listen(4000);

Как вы видите, макеты включены. Я пробовал ссылаться на него непосредственно в методе рендеринга, но это не имеет значения. Стоит также отметить, что "title:" Мой сайт "также не работает.

index.jade

h2 Hello!
p I really hope this is working now

lo.jade

!!! 5
html
  head
    title Why won't this work
  body
    h1 I AM A LAYOUT
    div= body

Здесь мой npm list:

├─┬ [email protected] 
│ ├── [email protected] 
│ ├─┬ [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ ├── [email protected] 
│ │ └── [email protected] 
│ ├── [email protected] 
│ ├── [email protected] 
│ └── [email protected] 
└─┬ [email protected] 
  ├── [email protected] 
  └── [email protected] 

Любые идеи о том, почему это не работает?

4b9b3361

Ответ 1

Я думаю, что вы делаете макет неправильно. Я делаю это так:

Я установил макет в значение false:

app.set('view options', {
    layout: false
});

В файле layout.jade:

doctype 5
html(lang="en")
    head
        title MySite #{title}
body
    block mainContent

И на отображаемой странице (скажем: home.jade), которая включает переменную (содержимое)

extends layout

block mainContent
    h1 This is home
    p= content

У вас может быть другая страница, основанная на (расширении) одного и того же макета (other.jade) с разными переменными (пользователем)

extends layout

block mainContent
    h1 Oh look ! Another page
    p= user

И назовите их следующим образом:

app.get('/', function(req, res) {
    res.render('home', { 
        title : "Home",
        content: "Some Home page content"
    });
});

app.get('/anotherPage', function(req, res) {
    res.render('other', { 
        title : "Other page",
        user: "Here goes a user name"
    });
});

Ответ 2

Это, кажется, изменение последней версии Express/jade.

Express:  '3.0.0alpha1': '2012-04-18T22:47:46.812Z'
Jade:     '0.25.0':      '2012-04-18T22:40:01.162Z' 

Поймал меня тоже!

Несколько других вещей изменились, - потребовалось некоторое время, чтобы разобраться.

К сожалению, Express и Jade не особенно хорошо документированы, и многие из примеров, которые вы найдете в Интернете, устарели.

Арно дал новый способ использовать макет сейчас. Я не знаю, что старый способ работает вообще. Конечно, когда я пытался что-то вроде dtyon, и он больше не работает.

Итак, проверьте, какую версию Express и Jade вы установили с помощью команд:

npm show express dist.tarball
npm show jade dist.tarball

Надеюсь, это поможет. J.

Ответ 3

Насколько я могу судить, по умолчанию файл макета следует называть "layout.jade". Однако, если вы хотите другое имя, вы можете использовать опцию подсказки "layout" при рендеринге:

res.render('index', { layout: 'lo', title: 'My site' });

Я также предполагаю, что файл макета lo.jade находится в корневом каталоге /views/.

Ответ 4

У меня была такая же проблема, так что люди знают, что новый способ работы макетов в express/jade заключается в том, что макет уже расширен по умолчанию, и ваш блок автоматически передается как переменная body

например.

index.jade

/* This will be passed as "body" no need for "block body" */
h1= title
p Welcome to #{title}

layout.jade

doctype
html
  head
    meta(charset='utf-8')
  body
    /* body is output here using != which outputs variable without escaping characters */
    section!= body