Nunjucks импортирует шаблон и передает конкретные данные, например, веточку с ключевым словом - PullRequest
0 голосов
/ 06 июня 2019

https://mozilla.github.io/nunjucks/templating.html#include

Я хочу иметь возможность передавать данные во включенный шаблон.

Nunjucks очень похож на Twig и, конечно, основан на ниндзя ..

В ветке можно импортировать файл и передать данные: https://twig.symfony.com/doc/2.x/tags/include.html

Мне действительно нужно быть в состоянии сделать это в проекте nodejs с nunjucks, это возможно?

1 Ответ

0 голосов
/ 07 июня 2019

Самый простой способ - определить пользовательский фильтр render.Он принимает имя шаблона в качестве отфильтрованного значения и данные в качестве аргументов: {{ 'some-template-name' | render(data) }}.

/views
  test.html
  test2.html
app.js

//app.js
const nunjucks = require('nunjucks');
var env = new nunjucks.Environment(new nunjucks.FileSystemLoader('views'));

env.addFilter('render', function (template, ctx) {
    try {
        return env.filters.safe(env.render(template, ctx));
    } catch (err) {
        return err.message;
    }
});

var html =  env.render('test.html', {a: '100'});
console.log(html);

// test.html
TEST {{a}}
{{ 'test2.html' | render({b: 200}) }}   

// test2.html
TEST2 {{b}}

Также вы можете определить собственные теги (расширение), например, {% mytag = "/some-template-path", {data} %}

PS Асинхронная версия

env.addFilter('render', function (template, ctx, cb) {
    try {
        env.render(template, ctx, (err, html) => cb(err, !err ? env.filters.safe(html) : undefined))
    } catch (err) {
        console.error('Render error', err.message);
        console.error(template, ctx);
        cb(err);
    }
}, true);
...