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

Переменная переменной для EJS включает

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

Что-то вроде:

var headerLocation = 'some/location/header.ejs'; 
res.render( viewDir + '/index', {
        header: headerLocation 
    } );

И в файле шаблона:

<% include header %>

заголовок - это значение, переданное вместе с рендером.

Это кажется невозможным, но, возможно, я пропустил что-то, поэтому подумал, что я попрошу здесь.

EDIT:

Это упоминается в комментариях к ответам ниже, но для обобщения это теперь доступно в версии 2 EJS.

Смотрите здесь: https://github.com/mde/ejs#includes И связанная дискуссия здесь: https://github.com/tj/ejs/issues/93

4b9b3361

Ответ 1

Эта функция добавлена: если это не путь (файл не найден), он оценивается как имя переменной. https://github.com/visionmedia/ejs/pull/156

Ответ 2

Вот какой-то демо-код, который может выполнять динамический.

Просмотр

<div flex class="main-container">
    <%- include(page) %>
</div>

маршрутизатор

router.get('/', function (req, res, next) {
    res.render('pages/index', {
        page: 'home'
    });
});

Ответ 3

Несмотря на то, что это старый вопрос, отвечая на него ради других.

В соответствии с документацией github, похоже, EJS не имеет понятия блоков, включая только время компиляции. Поскольку время его компиляции включает, вам нужно жестко определить местоположение.

Итак, вы остаетесь с передачей некоторых флагов и выполняете, если проверяете в заголовке или обрабатываете заголовок как html и передаете его всем шаблонам...

Ответ 4

Старая тема, но она может кому-то помочь.

Самое замечательное в EJS - это то, что это просто Javascript. Так что-то вроде следующего должно работать:

<%
const fs = require('fs');
const content = fs.readFileSync(partial);
%>
<%- content %>

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