Custom Filters
使用 Environment
的 addFilter
方法添加一个自定义的过滤器,过滤器时一个函数,第一个参数为目标元素,剩下的参数为传入过滤器的参数。
var nunjucks = require('nunjucks');
var env = new nunjucks.Environment();
env.addFilter('shorten', function(str, count) {
return str.slice(0, count || 5);
});
添加了一个 shorten
的过滤器,返回前 count
位数的字符,count
默认为 5,如下为如何使用:
{# Show the first 5 characters # }
A message for you: {{ message|shorten }}
{# Show the first 20 characters # }
A message for you: {{ message|shorten(20) }}
Keyword/Default Arguments
在模板中说道,nunjucks 支持关键字参数,你可以在 filter 中使用他。
所有的关键字参数会以最后一个参数传入,以下为使用了关键字参数的 foo
过滤器:
env.addFilter('foo', function(num, x, y, kwargs) {
return num + (kwargs.bar || 10);
})
模板可如下使用:
{{ 5 | foo(1, 2) }} -> 15
{{ 5 | foo(1, 2, bar=3) }} -> 8
你必须在关键字参数之前传入所有的位置参数 (foo(1)
是有效的,而 foo(1, bar=10)
不是),你不能使用将一个位置参数当作关键字参数来用 (如 foo(1, y=1)
)。
Asynchronous
异步过滤器接受一个回调继续渲染,调用 addFilter
时需传入第三个参数 true
。
var env = nunjucks.configure('views');
env.addFilter('lookup', function(name, callback) {
db.getItem(name, callback);
}, true);
env.render('{{ item|lookup }}', function(err, res) {
// do something with res
});
回调需要两个参数 callback(err, res)
,err
可以为 null。
注意:当预编译时,你必须指定所有的异步过滤器,查看 Precompiling。