假设我用Sails.js写了一个博客应用程序。
在这个应用程序的每个页面上,都有一个名为“最近的帖子”的侧边栏小部件,它列出了5个最近发布的帖子的标题,然后点击它们就可以看到这个帖子。
因为每个页面上都有这个侧栏小部件,所以它应该在layout.ejs
中。但是,这里我们有一个冲突-动态内容只应该从控制器操作中的数据库中提取,用于呈现特定的视图。
这个动态内容不是针对特定视图的,而是针对整个站点的(通过layout.ejs)。
根据我所理解的约定,我必须获取中的侧栏小部件的动态内容数据--每个呈现视图的控制器操作(否则,当我试图在文件中调用该控件时,会得到一个未定义的错误)。
我试过/考虑过的事情:
config/globals.js
),将我的动态内容从数据库中作为变量加载到配置文件中,然后在我的layout.ejs文件中调用sails.config.globals.[variable_name]
。这也起了作用,因为显然配置变量在应用程序中随处可见--但这是一个我不喜欢的讨厌的解决方案(我正在加载的内容只是最近5个帖子的标题和片段,而不是解决方案所暗示的“全局配置选项”)。<% %>
文件中的动态内容。我不确定这是否有效,但即使这样,它也违背了关注点的分离MVC原则,如果可能的话,我想避免这样做(如果它甚至有效的话)。所以, -所以,
发布于 2013-12-04 11:43:32
在文件夹/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();
});
});
}
}
然后在您的视图中做一些简单的循环:
<% 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
发布于 2014-12-19 16:58:18
我找到了另一种方法。我所做的就是创建一个服务,通过简单地利用已经在sails中的ejs库,将.ejs文件呈现为普通的html。该服务可以由控制器调用,甚至可以作为局部变量中的函数传递,并在.ejs中执行。名为TopNavBarService的服务如下所示:
var ejs = require('ejs');
exports.render = function() {
/* database finds goes here */
var userInfo = {
'username' : 'Kallehopp',
'real_name' : 'Kalle Hoppson'
};
var html = null;
ejs.renderFile('./views/topNavBar.ejs', {'locals':userInfo}, function(err, result) { html = result; });
return html;
}
在斗牛犬中,它看起来可能是:
module.exports = {
testAction: function (req, res) {
return res.view('testView', {
renderNavbar: TopNavBarService.render // service function as a local!
});
}
};
通过这种方式,您可以创建定制的ejs-助手,它甚至可以接受参数(尽管这里没有显示)。当调用时,助手可以访问数据库并呈现html的一部分。
<div>
<%- renderNavbar() %>
</div>
https://stackoverflow.com/questions/20267550
复制