V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
w88975
V2EX  ›  Node.js

express + EJS 怎么给 layout template 加 controller?

  •  
  •   w88975 · 2015-08-21 16:56:08 +08:00 · 3343 次点击
    这是一个创建于 3385 天前的主题,其中的信息可能已经有所发展或是发生改变。

    RT,用 EJS 来做渲染,用给每个 view 赋予了一个 layout,但是如果我想在 layout 里做一些操作,如何才能给 layout 加一个 controller 呢?

    9 条回复    2015-08-24 22:04:32 +08:00
    flyingkid
        1
    flyingkid  
       2015-08-21 17:20:59 +08:00
    songyuwen
        2
    songyuwen  
       2015-08-21 18:35:06 +08:00
    我想问下,除了 expressjs 之外,还有什么比较成熟(至少大企业在用)的框架?
    w88975
        3
    w88975  
    OP
       2015-08-21 19:10:03 +08:00
    @flyingkid middle ware 我也知道,只是好像没有专门给 EJS layout 加 controller 的.
    haozhang
        4
    haozhang  
       2015-08-21 19:15:56 +08:00 via iPhone
    在<%%>里写逻辑代码?
    w88975
        5
    w88975  
    OP
       2015-08-21 20:59:13 +08:00
    @haozhang 这样未必太蛋疼了一点 还不知道能不能 require node 模块
    jarlyyn
        6
    jarlyyn  
       2015-08-21 22:34:09 +08:00
    楼主是想问怎么在 layout 里加载独立的数据吧?

    由于 nodejs 是异步的。无法在最后的渲染视图的里再载入数据的。

    我的做法有两个

    1.是注册一些数据,绑定到视图 /布局上,调用布局是自动获取。参照 http://www.v2ex.com/t/199464#reply11
    的回复,

    大概是

    module.exports=function (app,web ){
    var MVC=web.MVC;
    MVC.viewpath=__dirname+'/views/';
    MVC.registerView ('layouts/main');
    MVC.registerView ('404').setLayout ('layouts/main');
    //MVC.registerView ('layoutName').bindData ('dataName');
    MVC.registerView ('index').setLayout ('layouts/main').bindData ('homeslider');
    //MVC.registerView ('viewname').setLayout ('layoutViewname').bindData ('dataName');
    }

    2.用 backbones+react ,前端处理

    model 的更新后页面自动更新,不管是 layout 还是 view 的部分。
    w88975
        7
    w88975  
    OP
       2015-08-22 00:11:02 +08:00
    @jarlyyn 比较蛋疼 我已经改成了 ajax 了 你这方法我试试看
    zonghua
        8
    zonghua  
       2015-08-22 10:24:24 +08:00 via iPhone
    怎么在 ejs 截取字符串?比如文章梗概,现在只是在路由截取
    oct16
        9
    oct16  
       2015-08-24 22:04:32 +08:00
    我是比较简易的实现,改了下 express 的路由。
    这样?

    路由:
    module.exports = function (app ) {
    app.get ("/*", function (req, res, next ) {
    toControl (req,res )
    });

    app.post ("/*", function (req, res, next ) {
    toControl (req,res )
    });

    function toControl (req,res ){
    var key = req.params['0'];
    var control = require ('../controllers/' + key );
    control (req,res );
    }
    }

    controller :
    var xxx = require ('../models/xxx.js');
    module.exports = function (req,res ){
    if (req.method == "GET"){
    xxx.get ('xxxxx', function (err, xxx ) {
    .........
    res.render ( '<ejs path>', {
    xxxx1 : 'xxxx',
    xxxx2 : 'xxxx'
    });
    });
    }else if (req.method == "POST"){
    ..........
    }
    };
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1160 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:41 · PVG 02:41 · LAX 10:41 · JFK 13:41
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.