Nodejs jade условное расширение

Я хотел бы, чтобы моя страница Jade расширяла различные макеты, в зависимости от состояния. Поэтому мой код выглядит так:

if myConditionVariable
  extends layout1
else
  extends layout2  
block content
  p here goes my content!

Теперь это не работает. Кажется, будут соблюдаться только последние определенные расширения, независимо от условий. Я также попытался динамически определить templatename, например

extends myLayoutNameVariable

и установите myLayoutNameVariable разными способами (выражайте динамическую вспомогательную функцию, задайте ее как var, local var и т.д.)

Есть ли другое решение для условных макетов, или кто-нибудь может сказать мне, что я делаю неправильно?

Cheers, simon

Ответ 1

Кажется, это проблема, которая все еще открывается на github.

Ответ 2

Итак, немного менее навязчивый способ справиться с этим - это изменить сам макет.

Я добавил немного промежуточного программного обеспечения, а остальные потоки.

app.use(function(req, res, next){
    res.locals.isAjax = req.headers['x-requested-with'] && 
        req.headers['x-requested-with'] === 'XMLHttpRequest';
    next();
});

Теперь, когда это установлено, "isAjax" доступен для нефрита.

В моем "layout.jade" (шаблон, из которого вы простираетесь), я делаю это:

- if(!isAjax)
  doctype 5
    html
      head
      body
        block content
        block scripts
- else
  block content
  block scripts

Я удалил другие элементы полного layout.jade для (надеюсь) ясности.

Наконец, мои обычные представления, которые расширяют layout.jade без изменений (этот нефритовый шаблон включает оба случая).

extends layout.jade
  .container.
     This is text will be wrapped for a non-ajax request, 
     but not for an ajax request.

Ответ 3

Я надеюсь, что это не слишком поздно, но я столкнулся с этой проблемой, и я думаю, что я нашел способ обхода:

  • Сделайте layout.jade, что conditionaly включает в себя оба макета:

    layout.jade:
    
    if conditionalVariable
        include firstLayout.jade
    else
        include otherLayout
    
  • В вашем представлении растяните layout.jade и определите conditionalVariable в контроллере (true/false):

    view.jade:
    
    extends layout
    
    block content
        p here goes my content!
    
  • Дискотека!

Ответ 4

Можете ли вы сделать что-то вроде:

if myConditionVariable
  p test

?

Если нет, вы передаете myConditionVariable правильно, когда говорите, чтобы сделать это представление? Короткий пример:

app.get "/", (req, res) ->
  res.render "index",
    myConditionVariable: true