2015-10-02 60 views
8

我一直在使用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和問題日誌中的引用,但我幾乎找不到任何東西。我認爲我錯過了一些非常明顯的東西,但似乎找不到它。

有什麼想法?

+0

你能告訴我們nunjucks grunt配置嗎? – Josh

+0

當然,好點。我早就這麼做了,但是沒有想到那裏有什麼有趣的東西,也不想渾水。但是,在這一點上我可能無法決定什麼是相關的,什麼是不是。將在一會兒編輯。 – gary

回答

2

繼續調試後,我終於把醜化和requirejs出與下面的測試設置的公式:

的index.html:

<html> 
<head> 
    <script src="nunjucks-slim.js"></script> 
    <script src="common.js"></script> 
</head> 

<body> 

    <script src="test.js"></script> 
</body> 

</html> 

我的模板,這是編譯爲common.js:

<div> 

<p>{{ value }}</p> 

<p>{{ object|pretty }}</p> 

<p>{{ func(4) }}</p> 

<p>{{ func(x) }}</p> 

<p>{{ args(4)|pretty }}</p> 

<p>{{ local(4) }}</p> 

<p>{{ local(x) }}</p> 

</div> 

test.js是行使模板的代碼:

var env = new nunjucks.Environment(null), 
    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; 
}; 

console.log(env.render('core/root/test.nj', { 
    'local': local, 
    'x': 4 
})); 

最後,這表明該問題(添加評論)輸出:

<div> 

<p>3</p> // value 

<p>{ 
    "a": 2 // object|pretty 
}</p> 

<p>func: undefined</p> // func(4) 

<p>func: undefined</p> // func(x) 

<p>{}</p> // args(4)|pretty 

<p>local: undefined</p> // local(4) 

<p>local: undefined</p> // local(x) 

</div> 

我花了幾個小時通過編譯模板代碼加強試圖找出這個問題(這是非常豐富的,由方式),然後面對 - 因爲我已經消除requirejs我可以再試一次nunjucks v2.1.0

點擊幾下後,我曾工作的測試代碼:

<div> 

<p>3</p> 

<p>{ 
    a: 2 
}</p> 

<p>func: 4</p> 

<p>func: 4</p> 

<p>{ 
    0: 4 
}</p> 

<p>local: 4</p> 

<p>local: 4</p> 

</div> 

所以,雖然它本來不錯,找出並解決問題(與V1.3.4),的答案似乎是「升級到nunjucks v2.1.0」

相關問題