我一直在使用nunjucks幾個月,並發現它是一個很棒的模板引擎。然而,今天早上我遇到了一個似乎很簡單的問題,但我根本無法弄清楚。我希望另一組眼睛可以幫助指出解決方案。nunjucks函數參數到達undefined
問題:如果我將函數傳遞給模板,則傳遞給該函數的任何參數在函數體內都是未定義的。
值和對象可以毫無問題地傳遞給模板,如果我傳遞一個函數,我可以從函數內部登錄到控制檯(所以我知道函數本身存在),但參數都是未定義的。
這最初看起來像是可以用閉包解決的問題,但是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預編譯我的模板,然後uglifying結果。是我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的幾個中的一個,然後進入變醜使用設置common.min.js以上。請注意,我已嘗試編譯模板而不使用uglifying,但獲得相同的結果。
這是非常基本的功能,所以如果這是一個錯誤,我希望看到很多關於SE和問題日誌中的引用,但我幾乎找不到任何東西。我認爲我錯過了一些非常明顯的東西,但似乎找不到它。
有什麼想法?
你能告訴我們nunjucks grunt配置嗎? – Josh
當然,好點。我早就這麼做了,但是沒有想到那裏有什麼有趣的東西,也不想渾水。但是,在這一點上我可能無法決定什麼是相關的,什麼是不是。將在一會兒編輯。 – gary