Node.js 如何在compoundjs中处理不同名称空间的单独布局

Node.js 如何在compoundjs中处理不同名称空间的单独布局,node.js,compoundjs,Node.js,Compoundjs,嘿,伙计们,我是一个刚开始研究nodejs的noob。我正在使用compoundjs在nodejs上开发一个web应用程序 这是“我的视图”文件夹的结构 views/ |-- admin | |-- games | |-- squadplayertypes | `-- toursection | |-- tourformats | |-- tourmatchtypes | `-- tours |-- layouts | |-- admin |

嘿,伙计们,我是一个刚开始研究nodejs的noob。我正在使用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');

不幸的是,目前似乎没有一种方法至少可以在名称空间区域整洁地做到这一点。在中搜索布局,其中控制器的名称用于搜索布局,然后在应用程序布局中默认

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

名称空间示例:

map.namespace('reports', function (reports) {
    reports.resources('billing');
});
控制器:

layout('reports');

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

不幸的是,目前似乎没有一种方法至少可以在名称空间区域整洁地做到这一点。在中搜索布局,其中控制器的名称用于搜索布局,然后在应用程序布局中默认

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

名称空间示例:

map.namespace('reports', function (reports) {
    reports.resources('billing');
});
控制器:

layout('reports');

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

我相信@making3已经指出了一个标准的方法。虽然可以在应用程序控制器中进行恶意攻击,但如果您确定属于您的管理部分的url中始终包含/admin/,并且此类url将仅加载管理布局,则可以按照以下方法将以下代码添加到您的应用程序控制器中

before('mylayout', function(){
    if(req._parsedUrl.pathname.indexOf('/admin/') != -1)
        layout('admin/admin');
    next();
});
这将添加一个before处理程序,该处理程序将检查当前url,而不检查查询参数,如果该url包含/admin/它将为使用admin命名空间路由调用的所有控制器操作设置布局

希望这有帮助


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

我相信@making3已经指出了一种标准的方法。虽然可以在应用程序控制器中进行恶意攻击,但如果您确定属于您的管理部分的url中始终包含/admin/,并且此类url将仅加载管理布局,则可以按照以下方法将以下代码添加到您的应用程序控制器中

before('mylayout', function(){
    if(req._parsedUrl.pathname.indexOf('/admin/') != -1)
        layout('admin/admin');
    next();
});
这将添加一个before处理程序,该处理程序将检查当前url,而不检查查询参数,如果该url包含/admin/它将为使用admin命名空间路由调用的所有控制器操作设置布局

希望这有帮助


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

谢谢@making3。这是一种非常干净的方式来完成我想要实现的目标。谢谢@making3。这是一种非常干净的方法,可以实现我试图实现的目标。此解决方案适用于大多数情况,但如果我将路由定义为/signin/:param/,并将其替换为param,则您的解决方案将失败。我同意您可以这样做。如果您要这么做,我建议您在控制器库中实现一种灵活的方法,可以根据父路径查找布局/例如,admins/toursection将尝试查找admins_布局。此解决方案适用于大多数情况,但如果我已将路由定义为/signin/:param/,并代替param I send admin,则您的解决方案将失败。我同意您可以这样做。如果您要这么做,我建议您在控制器库中实现一种灵活的方法,可以根据父路径查找布局/例如,admins/toursection将尝试查找admins\u布局。