2011-12-27 51 views
12

使用Express.js,我想將Jade模板的局部視圖渲染爲變量。在Express.js中,如何渲染不帶「響應」對象的Jade局部視圖?

通常情況下,你直接呈現局部視圖響應對象:

response.partial('templatePath', {a:1, b:2, c:3}) 

然而,因爲我是一個Socket.io服務器事件裏面,我沒有「反應」的對象。

是否有一種優雅的方式來使用響應對象將Jade局部視圖渲染爲變量而不使用

回答

13

您可以手動編譯Jade模板。

var jade = require('jade'); 
var template = require('fs').readFileSync(pathToTemplate, 'utf8'); 
var jadeFn = jade.compile(template, { filename: pathToTemplate, pretty: true }); 
var renderedTemplate = jadeFn({data: 1, hello: 'world'}); 
+2

完美的作品,謝謝!我使用以下命令來解析pathToTemplate: var pathToTemplate = require('path')。resolve(__ dirname,'../views')+ templateName +'.jade'; – 2011-12-27 13:25:58

+1

非常感謝!我有這個問題試圖適應部分,你的答案是谷歌的第一個結果。你搖滾的男人! – 2012-06-30 00:21:10

+0

這個答案是正確的**但如果你想使用緩存機制**檢查[matthias響應](http://stackoverflow.com/questions/8644580/in-express-js-how-can-i-render-a -jade-partial-view-without-a-response-object#answer-12725703) – fider 2014-01-21 10:14:11

13

這裏的直接解決這個問題的快車3個用戶(其現在應該被廣爲流傳):

res.partial()已被刪除,但你可以隨時使用app.render使用回調函數,如果響應對象不是當前上下文的一部分像在Liors情況下():

app.render('templatePath', { 
    a: 1, 
    b: 2, 
    c: 3 
},function(err,html) { 
    console.log('html',html); 
    // your handling of the rendered html output goes here 
}); 

由於app.render()是應用程序明確objec的函數它自然意識到已配置的模板引擎和其他設置。它的行爲方式與app.get()或其他快速請求事件上的特定res.render()行爲相同。

參見:

+0

這種方式更好,因爲使用緩存?我對嗎? @matthias **糾正我,如果我錯了** ?? – fider 2014-01-21 10:11:27

+0

據我所知,(編譯的)jade模板在生產環境下被緩存(NODE_ENV =「production」),所以的確如此。另一方面,使用@emostars手動讀取fs和編譯的方法,您可以靈活地控制自己的緩存行爲,例如,重複使用''jadeFn'''而不需要重新讀取或重新編譯原始的玉石模板字符串。 – matthias 2014-01-21 13:57:02