Użyj zmiennej w Jade include

Pracuję z Jade i Express i chciałbym użyć zmiennej w moim oświadczeniu include. Na przykład:

App.js

app.get('/admin', function (req, res) {
  var Admin = require('./routes/admin/app').Admin;

  res.render(Admin.view, {
    title: 'Admin',
    page: 'admin'
  });
});

Układ.jade

- var templates = page + '/templates/'

include templates

Kiedy to robię dostaję błąd EBADF, Bad file descriptor 'templates.jade'

I even tried

include #{templates}

Bezskutecznie.

Author: Spencer Carnage, 2012-08-26

4 answers

AFAIK JADE nie obsługuje dynamicznych w tym. Proponuję "załączyć" poza szablon, czyli

App.js

app.get('/admin', function (req, res) {
    var Admin = require('./routes/admin/app').Admin;
    var page = 'admin';

    var templates = page + '/templates/';

    // render template and store the result in html variable
    res.render(templates, function(err, html) {

        res.render(Admin.view, {
            title: 'Admin',
            page: page,
            html: html
        });

    });

});

Układ.jade

|!{ html }
 42
Author: freakish,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-26 19:44:40

To również działa:

//controller
var jade = require('jade');
res.render('show', {templateRender: jade.renderFile});


//template
!= templateRender('my/path/'+dynamic+'.jade', options)

Prawdopodobnie nie zwiększy to wydajności, jakiej można oczekiwać po użyciu ustawienia 'view cache' (domyślnie jest włączone w NODE_ENV = = = 'production'). Lub nawet złamać aplikację (np. jeśli pliki nie są dostępne na dysku twardym podczas wdrażania nowego kodu). Również próba użycia tej sztuczki w aplikacji po stronie klienta lub izomorficznej nie zadziała, ponieważ szablon nie może być skompilowany.

 19
Author: antpaw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-05-10 19:44:44

Znalazłem tę stronę w googlach dla tego samego pytania, ale w innym kontekście, więc pomyślałem, że moje rozwiązanie (Czytaj: obejście) tutaj dla potomności:

Chciałem otoczyć mój include większym kontekstem wyciągniętym ze zmiennej, np. (uproszczony):

- var templates = page + '/templates/'
- var headid = page + 'head'
- var imgsrc = '/images/' + page
div(id=headid)    
  h1 #{page}
  img(src=imgsrc)
div(id=page)
  include templates

Ponieważ to nie działa (Jade nie obsługuje Dynamic includes, jak zauważył freakish), użyłem mixin:

(Edit-trochę bardziej eleganckie niż moje poprzednie obejście:)

mixin page1
  include page1/templates

mixin page2
  include page2/templates

...

- for (var i = 0; i < 3; i++)
  - var page = 'page' + i
  - var headid = page + 'head'
  - var imgsrc = '/images/' + page
  div(id=headid)    
    h1 #{page}
    img(src=imgsrc)
  div(id=page)
    +page

Mój poprzedni odpowiedź:

mixin templates(page)
  - var headid = page + 'head'
  - var imgsrc = '/images/' + page
  div(id=headid)    
    h1 #{page}
    img(src=imgsrc)

+templates('page1')
#page1
  include page1/templates/

+templates('page2')
#page2
  include page2/templates/

...

Nie jest elegancki, i nie będzie działać, jeśli trzeba dołączyć więcej niż kilka rzeczy w ten sposób, ale przynajmniej część Jade jest dynamiczna.

 6
Author: Frijol,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-14 00:27:42

Dlaczego nie używać dziedziczenia jade?

Renderuj to, co chcesz na poziomie middleware:

res.render('templates/' + template_name + '.jade')

Write common common.jade:

h1 This is a page
.container
  block sublevel
    h2 Default content

Następnie zapisz plik rozszerzający common.jade:

extends common.jade
block sublevel
  h2 Some things are here
 1
Author: user2956171,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-01 17:12:07