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

将哪些服务添加到sails.js 中的api/services 文件夹中

Sails.js 控制器从 Promise 中获取数据

如何从 laravel 中的控制器向部分视图发送数据?

如何在控制器中获取部分视图数据

Sails.js - 忽略将路由 (/) 绑定到未知控制器的尝试 :: home