2014-06-27 37 views
2

我用快递框架Nose.JS的nooby用户,我尝试做一个引擎HTML这个层次:快速渲染功能与回调返回的字符串,而不是HTML

<template> 
    <layout> 
    <view> 
    </layout> 
</template> 

所以,这是我server.js文件(croped):

var express = require('express') 
     , http = require('http'); 
var app = module.exports = express(); 

app.configure(function() { 
    app.set('views', __dirname + '/views'); 
    app.set('view engine', 'ejs'); 
    app.engine('html', require('ejs').renderFile); 

    app.use(express.favicon()); 
    app.use(express.static(__dirname + '/public')); 
}); 

// Routes 
app.get('/', function(req, res) { 

    var data = { /* Some data here */ }; 

    /* Probleme start here : 
    * I want render the view HTML, 
    * then render the layout HTML with the view content, 
    * then render the template to display 
    */ 

    res.render('view', data, function(err, view) { 
     data.view = view; 
     res.render('layout', data, function(err, layout) { 
      data.layout = layout; 
      res.render('template', data);     
     });   
    }); 
}); 

就像我说的代码: 我想渲染HTML视图,然后渲染与视图内容布局HTML,然后渲染显示模板。但data.viewdata.layout是字符串,而不是HTML(如:HEADER<br/>Menu<br/>),所以如果我把HTML代码在这个文件,我有最后的页面上的HTML代码..

- --- [编辑:添加.ejs文件] -----

template.ejs

<div><%= layout %></div> 

layout.ejs

HEADER<br/> 
Menu<br/> 
<%= view %> 
FOOTER 

view.ejs

<p>View</p> 

我怎样才能得到HTML显示的结果上data.viewdata.layout?!

谢谢大家和对不起我的英语

亚瑟

回答

1

FWIW这是我用来获取Express 4的布局支持(EJS测试):

/* 
    Usage: 
    Set a global/default layout with: 
     app.set('view layout', 'bar'); 
    Set a layout per-render (overrides global layout) with: 
     res.render('foo', { layout: 'bar' }); 
    Or disable a layout if a global layout is set with: 
     res.render('foo', { layout: false }); 
    If no layout is provided using either of the above methods, 
    then the view will be rendered as-is like normal. 

    Inside your layout, the variable `body` holds the rendered partial/child view. 

    Installation: 
    Call `mpResponse();` before doing `require('express');` in your application. 
*/ 

function mpResponse() { 
    var expressResponse = require('express/lib/response'), 
     expressResRender = expressResponse.render; 
    expressResponse.render = function(view, options, fn) { 
    options = options || {}; 
    var self = this, 
     req = this.req, 
     app = req.app, 
     layout, 
     cb; 

    // support callback function as second arg 
    if (typeof options === 'function') 
     fn = options, options = {}; 

    // merge res.locals 
    options._locals = self.locals; 

    // default callback to respond 
    fn = fn || function(err, str) { 
     if (err) return req.next(err); 
     self.send(str); 
    }; 

    if (typeof options.layout === 'string') 
     layout = options.layout; 
    else if (options.layout !== false 
      && typeof app.get('view layout') === 'string') 
     layout = app.get('view layout'); 

    if (layout) { 
     cb = function(err, str) { 
     if (err) return req.next(err); 
     options.body = str; 
     expressResRender.call(self, layout, options, fn); 
     }; 
    } else 
     cb = fn; 

    // render 
    app.render(view, options, cb); 
    }; 
} 
+0

哇感谢你,但我该如何使用它?!我使用Express的版本〜3.3.4。 :/ – Arthur

+0

它可能也适用于Express 3.x,但我没有尝试过。 – mscdex

+0

我已经更新了所有的软件包,并使用<% - 而不是<%=,它的工作!吴? – Arthur