【问题标题】:nunjucks loop variable filternunjucks 循环变量过滤器
【发布时间】:2015-02-03 08:08:10
【问题描述】:
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。

如何编写循环?

【问题讨论】:

  • 你想生成什么?生成的 html 的理想外观如何?顺便说一句:您可以使用{% if..%} 来分支代码..
  • @xmojmr 我想根据数据循环到HTML。并且我可以自定义添加过滤器配置。现在不知道怎么写过滤器(| data.filter 会报错)

标签: nunjucks


【解决方案1】:

(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,则在运行JavaScript 模板渲染代码之前添加以下过滤器

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>

当应用于下面的数据集时(注意新的 round(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) 的方式很狂野、不安全且速度较慢,但​​可以使用任何用户提供的过滤器表达式

【讨论】:

  • 如果过滤器是round(2)...我的初衷是动态调用过滤器,过滤器就是用户配置
  • @user2632323 在我编辑的答案中查看 (2) 的方式。由于“代码注入”问题,我个人不会走这条路。如果代码对您有效并且您没有其他问题,请单击 Help Center > Asking > What should I do when someone answers my question? 中所述的“接受”按钮
猜你喜欢
  • 1970-01-01
  • 2020-01-22
  • 1970-01-01
  • 2021-10-16
  • 1970-01-01
  • 2015-05-16
  • 2018-11-14
  • 2019-07-14
  • 1970-01-01
相关资源
最近更新 更多