Custom Filters

使用 EnvironmentaddFilter 方法添加一个自定义的过滤器,过滤器时一个函数,第一个参数为目标元素,剩下的参数为传入过滤器的参数。

  1. var nunjucks = require('nunjucks');
  2. var env = new nunjucks.Environment();
  3. env.addFilter('shorten', function(str, count) {
  4. return str.slice(0, count || 5);
  5. });

添加了一个 shorten 的过滤器,返回前 count 位数的字符,count 默认为 5,如下为如何使用:

  1. {# Show the first 5 characters # }
  2. A message for you: {{ message|shorten }}
  3. {# Show the first 20 characters # }
  4. A message for you: {{ message|shorten(20) }}

Keyword/Default Arguments

模板中说道,nunjucks 支持关键字参数,你可以在 filter 中使用他。

所有的关键字参数会以最后一个参数传入,以下为使用了关键字参数的 foo 过滤器:

  1. env.addFilter('foo', function(num, x, y, kwargs) {
  2. return num + (kwargs.bar || 10);
  3. })

模板可如下使用:

  1. {{ 5 | foo(1, 2) }} -> 15
  2. {{ 5 | foo(1, 2, bar=3) }} -> 8

必须在关键字参数之前传入所有的位置参数 (foo(1) 是有效的,而 foo(1, bar=10) 不是),你不能使用将一个位置参数当作关键字参数来用 (如 foo(1, y=1))。

Asynchronous

异步过滤器接受一个回调继续渲染,调用 addFilter 时需传入第三个参数 true

  1. var env = nunjucks.configure('views');
  2. env.addFilter('lookup', function(name, callback) {
  3. db.getItem(name, callback);
  4. }, true);
  5. env.render('{{ item|lookup }}', function(err, res) {
  6. // do something with res
  7. });

回调需要两个参数 callback(err, res)err 可以为 null。

注意:当预编译时,你必须指定所有的异步过滤器,查看 Precompiling