Sails.js将数据从部分控制器发送到局部视图

时间:2015-08-25 19:52:13

标签: sails.js

我是sails.js的新手。我曾经在opencart工作过。在sails.js中,我们如何重用动态类别等功能(基于表数据)。所以在这种情况下会有一个菜单控制器和menu.ejs视图。我需要的是将有一个父控制器和一个父视图,如HomeController.js和HomeView.ejs。在该菜单部分内部将重复使用。与标题控制器/视图,页脚控制器/视图相同。 所以如果我路由到'/ home'那么它将调用HomeController.js。然后home会加载headerController,这会将数据发送到headerView。现在headerController将调用menuController和menuController将数据传递给menuView。请帮帮我。提前致谢。

2 个答案:

答案 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 %>
...

这只是一个简单的例子,你必须处理错误并使其适应你的需要。