如何在 ejs 中包含承诺值?
How to Include promise value in ejs?
我正在 express
和 ejs
的帮助下制作一个小型节点应用程序。
在我的一个控制器中,我 return 一个对象,它有一个承诺 属性 我想包含在我的视图中。我试图弄清楚执行此操作的最佳方法是什么,因为它似乎 ejs
无法处理承诺的值。我考虑改为在模型中包含承诺值,但似乎我过于复杂了需要完成的代码。
如何在 ejs
中轻松呈现 bluebird
承诺值?
控制器
compaintsRouter.get('/', function(req, res)
{
var model = data.complaint.findAndCount({
include: [data.user, {
model: data.comment,
include: [data.user]
}],
limit: 15,
offset: 15 * (req.query.page || 0)
}).then(function(result){
res.render('complaints/list', {model: result.rows});
});
});
ejs
查看模板
<% model.forEach(function(complaint) { %>
<div class="complaint">
... more html here...
<footer>
<span class="vote brand-success">
<% complaint.votesUp().then(function(votes){%>
<%= votes %>
<%}) %>
<span class="glyphicon glyphicon-thumbs-up clickable"></span>
</span>
</footer>
... more html here...
</div>
<% }) %>
约定的方法:
votesUp: function() {
return this.getFollower().then(function(followers){
var aux = followers
.selectMany(function(f){return f.UserComplaint})
.map(function(v){
return ((v.liked === true) ? 1: 0);
});
aux.push(0);
aux.reduce(function(acc, v){
return acc+v;
});
})
}
看起来答案可能是将业务逻辑大量混合到视图中。你能不能早点拿到选票,这样你就不用在模板里乱搞了?看起来很乱。 :)
(ps, +1 以抵消反对票)
我的 orm 似乎缺少一个功能,那就是 sequelize。只要我在查询中包含模型,它们就允许我检索关联。
需要进行的修改如下:
控制器
compaintsRouter.get('/', function(req, res)
{
var model = data.complaint.findAndCount({
include: [data.user, {
model: data.comment,
include: [data.user]
}, {
model: data.user,
as: 'follower'
}],
limit: 15,
offset: 15 * (req.query.page || 0)
}).then(function(result){
res.render('complaints/list', {model: result.rows});
});
});
使用数据的方法:
votesUp: function() {
var aux = this.follower
.selectMany(function(f){return f.UserComplaint})
.map(function(v){
return ((v.liked === true) ? 1: 0);
});
aux.push(0);
return aux.reduce(function(acc, v){
return acc+v;
});
}
我正在 express
和 ejs
的帮助下制作一个小型节点应用程序。
在我的一个控制器中,我 return 一个对象,它有一个承诺 属性 我想包含在我的视图中。我试图弄清楚执行此操作的最佳方法是什么,因为它似乎 ejs
无法处理承诺的值。我考虑改为在模型中包含承诺值,但似乎我过于复杂了需要完成的代码。
如何在 ejs
中轻松呈现 bluebird
承诺值?
控制器
compaintsRouter.get('/', function(req, res)
{
var model = data.complaint.findAndCount({
include: [data.user, {
model: data.comment,
include: [data.user]
}],
limit: 15,
offset: 15 * (req.query.page || 0)
}).then(function(result){
res.render('complaints/list', {model: result.rows});
});
});
ejs
查看模板
<% model.forEach(function(complaint) { %>
<div class="complaint">
... more html here...
<footer>
<span class="vote brand-success">
<% complaint.votesUp().then(function(votes){%>
<%= votes %>
<%}) %>
<span class="glyphicon glyphicon-thumbs-up clickable"></span>
</span>
</footer>
... more html here...
</div>
<% }) %>
约定的方法:
votesUp: function() {
return this.getFollower().then(function(followers){
var aux = followers
.selectMany(function(f){return f.UserComplaint})
.map(function(v){
return ((v.liked === true) ? 1: 0);
});
aux.push(0);
aux.reduce(function(acc, v){
return acc+v;
});
})
}
看起来答案可能是将业务逻辑大量混合到视图中。你能不能早点拿到选票,这样你就不用在模板里乱搞了?看起来很乱。 :)
(ps, +1 以抵消反对票)
我的 orm 似乎缺少一个功能,那就是 sequelize。只要我在查询中包含模型,它们就允许我检索关联。 需要进行的修改如下:
控制器
compaintsRouter.get('/', function(req, res)
{
var model = data.complaint.findAndCount({
include: [data.user, {
model: data.comment,
include: [data.user]
}, {
model: data.user,
as: 'follower'
}],
limit: 15,
offset: 15 * (req.query.page || 0)
}).then(function(result){
res.render('complaints/list', {model: result.rows});
});
});
使用数据的方法:
votesUp: function() {
var aux = this.follower
.selectMany(function(f){return f.UserComplaint})
.map(function(v){
return ((v.liked === true) ? 1: 0);
});
aux.push(0);
return aux.reduce(function(acc, v){
return acc+v;
});
}