2011-12-27 54 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