我是sails.js的新手。我曾经在opencart工作过。在sails.js中,我们如何重用动态类别等功能(基于表数据)。所以在这种情况下会有一个菜单控制器和menu.ejs视图。我需要的是将有一个父控制器和一个父视图,如HomeController.js和HomeView.ejs。在该菜单部分内部将重复使用。与标题控制器/视图,页脚控制器/视图相同。 所以如果我路由到'/ home'那么它将调用HomeController.js。然后home会加载headerController,这会将数据发送到headerView。现在headerController将调用menuController和menuController将数据传递给menuView。请帮帮我。提前致谢。
答案 0 :(得分:1)
服务器端框架MVC中的主体,如Sails,也与Laravel(PHP)相同,另一个,控制器不绑定到视图/前端组件中的部分元素。在服务器端框架中,控制器更像行为,具有视图/用户交互之间的逻辑行为(可以通过REST API或完整呈现的HTML视图完成),以建模代表存储系统并且与任何数据库/缓存系统无关。因此,控制器更多地由routes
表示,而不是由部分视图/组件表示。
如果你想要"控制器"与附加到部分视图/组件的行为一样,它是前端框架的工作,如Angular,Ember等。
答案 1 :(得分:1)
自the res.view()
method that you would call in each one of them is terminal以来,您无法嵌套控制器调用。
此方法是终端,这意味着它通常是最后一行代码 您的应用应针对给定的请求运行
控制器不呈现视图,它们向客户端调用res.view()
或res.json()
等方法发送http响应。
对于您正在讨论的 HeaderController ,我猜这些内容是静态的,您应该只在the layout中编写内容。
关于 MenuController ,我知道菜单可能会根据请求而改变,您不一定要构建单个页面应用程序,并且一旦页面是页面,您可能不想通过AJAX或websocket调用它加载。要以类似于您的描述的方式解决它,您可以使用独立于控制器呈现视图的可能性。
您可以创建一项服务来执行它:
// api/service/partials.js
module.exports = {
/**
* Renders the menu and pass the result in a callback cb(err, html)
* The "req" argument is present like in a controller method, but not "res"
* "data" could be an optional argument to pass extra configuration
*/
menu: function(req, data, cb) {
// Write here the logic to build the menu depending on the request
// Access to the express app to render the "menu.ejs" template
// see http://expressjs.com/3x/api.html#app.render
sails.hooks.http.app.render('menu', data, cb);
}
};
要呈现的模板示例:
<!-- views/menu.ejs -->
This is the menu <%= data %>
此时,您只需在所有控制器中调用partials.menu(req, data, function(err, html) {})
,并将生成的html注入控制器的视图中。但那将是很多重复的代码。让我们写一个policy来执行它:
// api/policies/dynamicMenu.js
module.exports = function(req, res, next) {
// Call the service that generate the content of the menu
// and inject the result in a "menu" variable accessible in the controller's template
partials.menu(req, {data: 'data test'}, function(err, html) {
res.locals.menu = html;
next();
});
};
你可以为每个&#34;部分&#34;写一个政策。 (例如:一个用于菜单,另一个用于页脚...)。 将policy应用于控制器:
// config/policies.js
module.exports.policies = {
// ...
// Apply the policy to controllers that display the menu
'aControllerThatDisplaysTheMenu': {
'*': ['dynamicMenu']
}
// ...
}
最后,在布局文件中显示菜单:
<!-- views/layout.ejs -->
...
<%= menu %>
...
这只是一个简单的例子,你必须处理错误并使其适应你的需要。