2016-03-22 3 views
1

Как nunjucks теперь поддерживает с помощью set as a block Я хотел сделать что-то вроде этого:nunjucks набор создать объект

{% set navigationItems %} 
    {% for item in items %} 
    { name: item.name, url: item.url }{% if not loop.last %},{% endif %} 
    {% endif %} 
{% endset %} 

Затем называют эту переменную в качестве входного объекта на другой макрос, например, так:

{{ navigation(items=[navigationItems]) }} 

Однако navigationItems оценивается как строка, а не массив-литерал. Любая идея, как, или если это возможно?

Спасибо.

ответ

1

Я не совсем уверен, чего вы пытаетесь достичь. Похоже, вы хотите перебрать один массив с именем items и скопировать его в новый массив с именем navigationItems. Возможно, items содержит больше ключей, чем вы хотите перейти к макросу?

Я собираюсь сделать это предположение, в противном случае вы можете просто скопировать items в navigationItems так:

{% set navigationItems = items %}

Этот пример работает:

{% macro navigation(items) %} 
    <ul> 
     {% for item in items %} 
      <li>{{ item.name }} - {{ item.url }}</li> 
     {% endfor %} 
    </ul> 
{% endmacro %} 

{% set websites = [ 
    { 
     name: 'Google', 
     url: 'http://google.com', 
     description: 'A search engine' 
    }, 
    { 
     name: 'GitHub', 
     url: 'http://github.com', 
     description: 'A webapp for your git repos' 
    }, 
    { 
     name: 'StackOverflow', 
     url: 'http://stackoverflow.com', 
     description: 'The answer: 42' 
    }] %} 

{% set navigationItems = [] %} 
{% for website in websites %} 
    {% set navigationItems = (navigationItems.push({name: website.name, url: website.url}), navigationItems) %} 
{% endfor %} 

{{ navigation(items=navigationItems) }} 

websites значения содержат description ключ который не передается массиву navigationItems. Если бы это был я, я просто передал бы website непосредственно на макрос navigation, так как ваши ключи: name и url одинаковы в обоих массивах.

Образец здесь почти как метод map в Javascript или Ruby.