SailsJs控制器上下文

时间:2014-10-16 07:32:29

标签: javascript sails.js

有人知道将上下文传递给sails控制器操作的正确方法吗? 我的理由是这样的:

--- AbstractPageController.js ---

module.exports = {
    _getPageData: function(req, res) {
        return {
            data: {
                title: this._getTitle(req, res), // if do nothing "this" is global object
                menu: this._getMenu(req, res)
            }
        };
    },

    _getTitle: function(req, res) { return 'Cool Page'; },

    _getMenu: function(req, res) { return [{ href: '/logout' }]; }
};

--- ConcretePageController.js ---

var _ = require('lodash');
    _super = require('./AbstractPageController.js');

module.exports = _.merge({}, _super, {

    'main': function(req, res) {
        res.view('pageTemplate', this._getPageData(req, res));
    },

    _getTitle: function(req, res) {
        return 'Absolutely - ' + _super._getTitle(req, res);
    },

    _getMenu: function(req, res) {
        return [{ href: '/main/'}].concat(_super._getMenu(req, res));
    }
});

这就是我需要背景的原因。

对于这个特殊情况,我找到了这个解决方案:

--- routes.js ---

var concreteController = require('../api/controllers/ConcretePageController.js');

module.exports.routes = {
    '/concrete_page': function(req, res) { concreteController.main(req, res); }
}

但它看起来有点难看,而且风帆钩子(例如政策)停止工作。

我正在考虑另一种方式。其重点是将所有逻辑移动到服务并使用简单的继承。但这对我来说也很奇怪

有关更好地了解我所写案例的任何想法吗?

P.S。我上面写的所有代码只是一个例子。

2 个答案:

答案 0 :(得分:1)

我想你想预先设置一些数据发送到视图模板,对吧?

是的,你可以使用一个前挂钩(如中间件)或帆警察

我在we-plugin https://github.com/wejs/we-plugin

中使用来自npm模块的preload sails功能的sails hook

检查此挂钩是否在控制器之后的所有请求中加载用户区域设置: 链接:https://github.com/wejs/we-example/blob/master/api/hooks/we-locale/index.js#L15

答案 1 :(得分:1)

您应该直接引用控制器

sails.controllers.yourControllerName.getTitle()

https://stackoverflow.com/a/20994036/1821723