我已经使用 nunjucks 几个月了,发现它是一个很棒的模板引擎。但是,今天早上我遇到了一个看似简单的问题,但我根本无法弄清楚。我希望另一双眼睛可以帮助指出解决方案。
问题:如果我将函数传递给模板,则传递给该函数的任何参数在函数体内都是未定义的。
值和对象可以毫无问题地传递给模板,如果我传递一个函数,我可以从函数内部登录到控制台(所以我知道函数本身就在那里),但参数都是未定义的。
这最初似乎可以通过闭包来解决,但是 1)我在我能找到的任何示例中都没有看到闭包,以及 2)当我尝试闭包时,我发现它们也收到了未定义的参数。
在这一天的过程中,我已经将我的代码缩减为几乎最简单的情况,但仍然无法解决这个问题:
模板:
<div>
<p>{{ value }}</p>
<p>{{ object|pretty }}</p>
<p>{{ func(4) }}</p>
<p>{{ args(4)|pretty }}</p>
<p>{{ local(4) }}</p>
</div>
呈现模板的代码(这是在 requirejs 定义中,未显示):
var nunjucks = require('lib/nunjucks-slim.min'), // v1.3.4
env = new nunjucks.Environment(null), // global templates
$tgt = $('#test'),
local;
env.addGlobal('value', 3);
env.addGlobal('object', {
a: 2
});
env.addFilter('pretty', function (obj) {
return JSON.stringify(obj, null, 2);
});
env.addGlobal('func', function (val) {
return 'func: ' + val;
});
env.addGlobal('args', function () {
return arguments;
});
local = function (val) {
return 'local: ' + val;
};
$tgt.html(env.render('test.nj', {
'local': local
}));
呈现的 HTML 如下所示:
3 // value
{ "a": 2 } // object|pretty
func: undefined // func
{} // args
local: undefined // local
所以,一个值是好的。该对象也可以正常工作,甚至在通过“漂亮”过滤器后看起来也不错。
但是,传递给“func”的值在函数体中变得未定义,并且在函数内部使用 arguments 变量没有帮助。此外,将函数直接传递到模板上下文(本地)也不起作用。
过滤器(基本上只是函数)工作正常,但常规函数不能,无论它们是作为模板上下文的一部分还是作为全局传递。
一些可能有帮助的注意事项:
我正在使用 requirejs 虽然(除了导入 nunjucks 本身)我试图从等式中消除它。
此示例使用 nunjucks v1.3.4。通过调试过程,我试图在 v2.1 中验证这种行为,但似乎 v2.x 可能破坏了 requirejs 的兼容性,我不想同时解决两个问题。
我正在使用 grunt-nunjucks 预编译我的模板,然后对结果进行丑化。我的 Gruntfile 的相关部分如下:
module.exports = function (grunt) { 'use strict'; grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), nunjucks: { common: { baseDir: 'site/', src: [ 'site/core/**/*.nj' ], dest: 'application/static/js/common.js' }, }, uglify: { templates: { options: { preserveComments: false, mangle: true, compress: { dead_code: true, loops: true, conditionals: true, booleans: true, unused: true, if_return: true, join_vars: true, drop_console: true } }, files: { 'application/static/js/common.min.js': ['application/static/js/common.js'], } } }, }); grunt.loadNpmTasks('grunt-nunjucks'); grunt.loadNpmTasks('grunt-contrib-uglify'); };
测试模板(如上所示)是编译成 common.js 的几个模板之一,然后使用上面的设置 uglified 成 common.min.js。请注意,我尝试编译模板而不进行丑化,但得到相同的结果。
这是非常基本的功能,所以如果这是一个错误,我希望在 SE 和问题日志中看到很多参考,但我几乎找不到任何参考。我想我错过了一些非常明显的东西,但似乎找不到它。
有什么想法吗?