如何在compoundjs中处理不同命名空间的单独布局

时间:2013-09-16 14:59:09

标签: node.js compoundjs

嘿伙计们我是一个刚刚开始研究nodejs的菜鸟。我正在使用compoundjs在nodejs上开发一个Web应用程序。

这是我的视图文件夹

的结构
views/
|-- admin
|   |-- games
|   |-- squadplayertypes
|   `-- toursection
|       |-- tourformats
|       |-- tourmatchtypes
|       `-- tours
|-- layouts
|   |-- admin
|   |   `-- toursection

我创建了一个名称空间来处理所有定向到“/ admin”的请求。

现在我想知道我是否可以在命名空间“admin”中为所有路由定义公共布局。

这就是我编写routes.js

的方式
    admin.namespace('toursection', function(toursection){
        toursection.resources('tours',function(tour){
            tour.post('fetchTourDetails','tours#fetchTourDetails',{collection:true});
        });
        toursection.resources('tourmatchtypes');
        toursection.resources('tourformats');
    });
    /*Routes for squad players and all related dependancies*/
    admin.resources('squadplayers');

2 个答案:

答案 0 :(得分:3)

不幸的是,它看起来似乎没有目前这样做的方式(至少在命名空间区域中整齐)。在controller-extensions library中搜索布局,其中控制器的名称用于搜索布局,然后默认为应用程序布局。

但是,可以定义一个要在多个视图之间使用的布局。您可以使用控制器顶部的layout功能来更改布局。例如,我可以为报告命名空间定义布局app/views/layouts/reports_layout.ejs

示例命名空间:

map.namespace('reports', function (reports) {
    reports.resources('billing');
});

控制器:

layout('reports');

action('index', function () {
    this.title = 'Billing Report';
    render();
});

答案 1 :(得分:1)

我相信@making3指出了一种标准的方法。虽然如果您确定属于您的管理部分的网址中始终包含 / admin / ,并且此类网址只会加载管理员,则可以在应用程序控制器中执行脏黑客攻击布局您可以按照以下方法并将以下代码添加到您的应用程序控制器

before('mylayout', function(){
    if(req._parsedUrl.pathname.indexOf('/admin/') != -1)
        layout('admin/admin');
    next();
});

这会添加一个before处理程序,它在没有查询参数的情况下检查当前url,如果它包含 / admin / ,它将为使用admin namespace routes调用的所有控制器操作设置布局。

希望这有帮助。

编辑:正如@guruwinder指出的那样,如果您已将路由配置为以:param 方式接受参数,则此操作将失败。所以在使用之前请小心。