Sails.js 将数据从部分控制器发送到部分视图
Posted
技术标签:
【中文标题】Sails.js 将数据从部分控制器发送到部分视图【英文标题】:Sails.js send data from partial controller to partial view 【发布时间】:2015-08-25 19:52:13 【问题描述】:我是sails.js 的新手。我在opencart上工作过。在sails.js 中,我们如何重用动态类别等功能(基于表格数据)。所以在这种情况下会有一个菜单控制器和 menu.ejs 视图。我需要的是有一个父控制器和一个像 HomeController.js 和 HomeView.ejs 这样的父视图。在该菜单部分内部将被重用。与页眉控制器/视图、页脚控制器/视图相同。 因此,如果我路由到“/home”,那么它将调用 HomeController.js。然后 home 将加载 headerController 这会将数据发送到 headerView。现在 headerController 将调用 menuController 和 menuController 将数据传递给 menuView。请帮助我。提前致谢。
【问题讨论】:
【参考方案1】:你不能嵌套控制器调用,因为the res.view()
method that you would call in each one of them is terminal。
这个方法是终端的,也就是说一般是最后一行代码 您的应用应该针对给定的请求运行
控制器不渲染视图,它们向客户端调用方法发送 http 响应,例如 res.view()
或 res.json()
。
对于你所说的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();
);
;
您可以为每个“部分”编写一个策略(例如:一个用于菜单,另一个用于页脚......)。 将policy 应用于控制器:
// config/policies.js
module.exports.policies =
// ...
// Apply the policy to controllers that display the menu
'aControllerThatDisplaysTheMenu':
'*': ['dynamicMenu']
// ...
最后,在布局文件中显示菜单:
<!-- views/layout.ejs -->
...
<%= menu %>
...
这只是一个简单的示例,您必须处理错误并对其进行调整以更好地满足您的需求。
【讨论】:
谢谢亚历克西斯。非常感激。我可以在服务中创建一个名为“menu”的通用方法并从 homeController.js 中调用它,比如 commonMethods:menu() 吗?然后在 HomeView.ejs 中我们可以添加 partial 并且我们可以简单地将数据传递给视图? 当然,请注意there is a warning about partials being rendered synchronously。在更新的ejs
版本中,partial
已被include
取代。【参考方案2】:
服务器端框架 MVC 中的主体,如 Sails,也与 Laravel (php) 相同,另外,控制器未绑定到视图/前端组件中的部分元素。在服务器端框架中,控制器的行为更像是视图/用户交互(可以通过 REST API 或完整呈现的 HTML 视图完成)与表示存储系统的模型之间的逻辑行为的桥梁,并且与任何数据库/缓存系统无关。因此控制器更多地由routes
表示,而不是由部分视图/组件表示。
如果您希望“控制器”具有附加到部分视图/组件的行为,这是前端框架的工作,如 Angular、Ember 等。
【讨论】:
以上是关于Sails.js 将数据从部分控制器发送到部分视图的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 Jquery 将数据从视图发送到控制器 Asp.net MVC