2014-12-05 4 views
1
var dataArr = [{ 
    name: 'name', 
    value: 'lcat' 
}, { 
    name: 'score' 
    value: '123.852', 
    filter: 'round' 
},{ 
    name: 'groups' 
    value: [1,2,3,6,0], 
    filter: 'sort' 
}] 

{% for data in dataArr %} 
    <div>{{ data[value] | data.filter }}<div> 
{% endfor %} 

Ошибка консоли: Ошибка: фильтр не найден: data.filter.nunjucks loop variable filter

Как написать цикл?

+0

Что вы хотите создать? Как бы выглядел сгенерированный html? BTW: вы можете использовать [{% if ..%}] (http://mozilla.github.io/nunjucks/templating.html#if), чтобы разветвить код. – xmojmr

+0

@xmojmr Я хочу, чтобы в соответствии с циклом данных HTML.And я могу настроить, чтобы добавить конфигурацию фильтра. Теперь я не знаю, как написать фильтр (| data.filter будет жаловаться) – user2632323

ответ

0

(1) Вы можете использовать if для разветвления петли на основе состояния, наблюдаемого в наборе данных. Например, этот Nunjucks код:

{% for data in dataArr %} 
    {% if data.filter == 'round' %} 
     <div>{{ data.value | round }}</div> 
    {% elif data.filter == 'sort' %} 
     <div>{{ data.value | sort }}</div> 
    {% else %} 
     <div>{{ data.value }}</div> 
    {% endif %} 
{% endfor %} 

производит этот html код:

<div>lcat</div> <div>124</div> <div>0,1,2,3,6</div> 

Из набора данных.

Вы можете играть с ним в этом jsFiddle: http://jsfiddle.net/xmojmr/gbLLryuz/


(2) Или вы можете свернуть свой собственный фильтр, который будет принимать произвольную строку выражения фильтра, определенный в наборе данных и ввести код (незащищенный) на страницу двигателестроение (Вы можете прочитать немного о том, почему намеренно позволяя инъекции кода не является хорошей идеей Wikipedia: Code injection)

Например, если env переменная типа Nunjucks.Environment затем добавить Ф.О. llowing фильтр перед запуском JavaScript шаблон кода Rendering

env.addFilter('eval', function(value, filterExpression) { 
    return env.renderString(
     "{{ filterArgument | " + filterExpression + " }}", 
     { filterArgument: value } 
    ); 
}); 

позволяет использовать упрощенную эквивалентную Nunjucks кода

{% for data in dataArr %} 
    {% if data.filter %} 
     <div>{{ data.value | eval(data.filter) }}</div> 
    {% else %} 
     <div>{{ data.value }}</div> 
    {% endif %} 
{% endfor %} 

Приведенный выше код производит следующий html код:

<div>lcat</div> <div>124</div> <div>123.85</div> <div>0,1,2,3,6</div> 

применительно к набор данных ниже (обратите внимание на новый раунд (2)):

{ 
    name: 'name', 
    value: 'lcat' 
}, { 
    name: 'score', 
    value: '123.852', 
    filter: 'round' 
}, { 
    name: 'score2', 
    value: '123.852', 
    filter: 'round(2)' 
}, { 
    name: 'groups', 
    value: [1,2,3,6,0], 
    filter: 'sort' 
} 

Вы можете играть с ним в этом jsFiddle: http://jsfiddle.net/xmojmr/jkb7ry9x/1/


То, как (1) является безопасным и достаточно быстро, но это предполагает, что вы знаете, список разрешенных пользовательских фильтры впереди

способ (2) дикие, небезопасная и медленнее, но позволяет использование любого предоставленного пользователем выражения фильтра

+0

Если фильтр ** round (2) ** ... Мое первоначальное намерение - динамически вызывать фильтр, фильтр - это пользовательская конфигурация – user2632323

+0

@ user2632323 Посмотрите способ ** (2) ** в моем отредактированном ответе.Лично я бы не пошел по этому пути из-за проблемы с «инъекцией кода». Если код работает для вас, и у вас больше нет вопросов, нажмите кнопку «принять», как описано в [Справочный центр> Задание> Что делать, если кто-то отвечает на мой вопрос?] (Http://stackoverflow.com/ помощь/кто-ответы) – xmojmr