假设我用 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#express 和 https://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/