sails.js - 将动态内容集成到 Sails.JS 应用程序中的layout.ejs 文件中的正确方法是什么?

标签 sails.js

假设我用 Sails.js 编写了一个博客应用程序。

在此应用的每个页面上,都有一个名为“最近帖子”的侧边栏小部件,其中列出了最近 5 篇帖子的标题,单击它们即可转到相关帖子.

因为这个侧边栏小部件存在于每个页面上,所以它应该位于 layout.ejs 中。但是,这里我们有一个冲突 - 动态内容只能在 Controller 操作中从数据库中提取以呈现特定 View 。

动态内容不是针对特定 View ,而是针对整个网站(通过layout.ejs)。

根据我理解的约定,我必须在呈现 View 的每个 Controller 操作中获取侧边栏小部件的动态内容数据(否则当我尝试时我会收到未定义的错误在我的layout.ejs 文件中调用本地的)。

我尝试过/考虑过的事情:

  • 呈现 View 的每个 Controller 操作中加载该动态内容(此解决方案非常糟糕),并在layout.ejs中调用该动态内容,就好像它是特定的本地内容一样看法。这工作得很好,但与 D.R.Y 背道而驰。原则,坦率地说,必须在每个 Controller 操作中对数据库运行相同的查询是一件很痛苦的事情。

  • 根据另一个类似的 stackoverflow 问题,创建一个新配置(例如 config/globals.js ),将动态内容从数据库加载到该配置文件中作为变量,然后调用 sails.config.globals.[variable_name]在我的layout.ejs 文件中。这也有效,因为显然配置变量在应用程序中随处可用——但这是一个我不喜欢的黑客解决方案(我加载的内容只是最近 5 篇文章的标题和内容,而不是“全局配置选项”,正如解决方案所暗示的那样)。

  • 运行查询以直接在某些 <% %> 之间获取 .EJS 文件内的动态内容。标签。我不确定这是否可行,但即使可行,它也违反了关注点分离 MVC 原则,并且我希望尽可能避免这样做(如果它甚至可行的话)。

  • 根据冗长的 IRC 讨论 @ http://webchat.freenode.net/?channels=sailsjs ,建议创建一个策略并将该策略映射到我的所有 Controller 。在该策略中,查询数据库中最近的 5 个帖子,并将它们设置为 req.recentposts。这个解决方案的问题是,虽然最近的帖子数据将传递到每个 Controller ,但我仍然必须将 req.recentposts 数据传递到我的 View - 使得我仍然必须修改每个 res.view({ }) 在每一个 Action 中。我不必在每个操作中都进行数据库查询,这很好,但我仍然必须向呈现 View 的每个操作添加一行代码......这不是 D.R.Y。我正在寻找更好的解决方案。

那么,什么是正确的解决方案,而不需要在每个 Controller 操作中加载动态内容(遵循 D.R.Y. 的解决方案)是我正在寻找的),以获得一些可用于我的layout.ejs 文件的动态内容?

最佳答案

在文件夹/config 中,您应该创建一个文件express.js 并添加类似的内容:

module.exports.express = {
    customMiddleware: function(app){
        app.use(function(req, res, next){
            // or whatever query you need
            Posts.find().limit(5).exec(function(err, posts){
                res.locals.recentPosts = posts;
                // remember about next()
                next();
            });
        });
    }
}

然后在你的 View 中做一些简单的循环:

<% for(var i=0; i<recentPosts.length; i++) { %>
    <% recentPosts[i].title %>
<% } %>

以下是一些指向文档中适当位置的链接: https://github.com/balderdashy/sails-docs/blob/0.9/reference/Configuration.md#expresshttps://github.com/balderdashy/sails-docs/blob/0.9/reference/Response.md#reslocals

关于sails.js - 将动态内容集成到 Sails.JS 应用程序中的layout.ejs 文件中的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20267550/

相关文章:

sails.js - Mocha 测试和装置

json - Sails Js-Waterline : Serialize, 解析并初始化模型

node.js - 我在 nodeMailer 中的附件路径不起作用(Sails 应用程序)

mysql - Sails.js(水线mysql)全局迁移属性

Sails.js WaterlineORM 如何在查询中使用 $and/$or 运算符

sails.js - 如何使用sails js禁用cookies

node.js - Sails 未在 Assets 文件夹中注入(inject)文件

testing - 如何在启用 CSRF 安全性的情况下测试 Sails.js v1.0 登录 Controller (使用 mocha、supertest)?

javascript - 在sails.js 中更改默认蓝图操作的最佳实践

node.js - sails : How to only authorize creation of a blueprint model