Вызвать макрос шаблона nunjucks, используя имя переменной

Учитывая макрос:

{% macro foo() %}
{% endmacro %}

Есть ли способ вызвать его, используя имя переменной:

{% set fn = 'foo' %}
... call macro using 'fn'

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


person cyberwombat    schedule 24.02.2016    source источник


Ответы (2)


Простой способ сделать это - использовать текущий context

let env = nunjucks.configure([
...
env.addGlobal('getContext', function(name) { 
    return (name) ? this.ctx[name] : this.ctx;
})

В шаблоне

{% macro foo (arg1, arg2) %}
    {{arg1}}{{arg2}}
{% endmacro %}

{% set fn = 'foo' %}
{{ getContext(fn)(arg1, arg2) }}
person Aikon Mogwai    schedule 11.08.2016
comment
это должен быть принятый ответ - он работает так, как требует оператор - person A Macdonald; 15.10.2018

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

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

{% macro eval(fn,data) %}
  {{ fn(data) }}
{% endmacro %}

Затем:

{% set fn = foo %}
{% set data = { this: that } %}
{{ eval(fn,data) }}

Чего я еще не понял, так это того, как оценить переменную, переданную в шаблон из внешнего источника.

person Jon Roobottom    schedule 14.03.2016