在刷新或二次发布之前不会显示 Flash 消息?
Flash message doesn't show until refresh or secondary post?
我再次进入 Sails.js 并努力在我的应用程序中创建即时消息(用于错误、成功或警报)。我一直在寻找一种好的方法,found this discussion,我实施了他们建议的解决方案。
通用机制运行良好,但是,只有在二次刷新或另一次 post 之后才会看到闪现消息。它最初不会在页面加载时显示。这是我组织所有内容的方式,我目前正在使用 "sails": "~0.10.0-rc7"
:
在我的 api/policies
文件夹中,我有 flash.js
:
// flash.js policy
module.exports = function(req, res, next) {
res.locals.messages = {
success: [],
error: [],
warning: []
};
if(!req.session.messages) {
req.session.messages = { success: [], error: [], warning: [] };
return next();
}
res.locals.messages = _.clone(req.session.messages);
// Clear flash
req.session.messages = { success: [], error: [], warning: [] };
return next();
};
在我的 api/services
中,我有 FlashService.js
:
// FlashService.js
module.exports = {
success: function(req, message) {
req.session.messages['success'].push(message);
},
warning: function(req, message) {
req.session.messages['warning'].push(message);
},
error: function(req, message) {
req.session.messages['error'].push(message);
}
}
我的 config/policies.js
也配置了 flash
策略:
// config/policies.js
module.exports.policies = {
'*': [true, 'flash'],
'UserController': {
'join': ['flash'],
},
};
现在,通过所有这些设置,我如何使用它的示例在我的 UserController
中用于我的 join
操作:
module.exports = {
join: function(req, res) {
// If username, email, and password compare come back true: create user.
if(newUser.username && newUser.email && newUser.password == newUser.confirmPassword) {
// Logic to create user.
res.view();
// If not, then report an issue.
} else {
FlashService.error(req, 'There was an issue.');
res.view();
};
}
};
最后,我的观点与我链接的讨论的代码完全相同。我在这上面使用 EJS
:
<% if (messages && messages['error'].length > 0) { %>
<div class="alert alert-danger">
<% messages['error'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
<% if (messages && messages['warning'].length > 0) { %>
<div class="alert alert-warning">
<% messages['warning'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
<% if (messages && messages['success'].length > 0) { %>
<div class="alert alert-success">
<% messages['success'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
我做错了什么?任何帮助将不胜感激!
谢谢,
在执行控制器之前正在读取您的消息(并且只是在读取消息后设置消息)。 req 对象在您的视图中可用,您应该直接将 req.session.messages['xxxx'] 读入您的视图。
我再次进入 Sails.js 并努力在我的应用程序中创建即时消息(用于错误、成功或警报)。我一直在寻找一种好的方法,found this discussion,我实施了他们建议的解决方案。
通用机制运行良好,但是,只有在二次刷新或另一次 post 之后才会看到闪现消息。它最初不会在页面加载时显示。这是我组织所有内容的方式,我目前正在使用 "sails": "~0.10.0-rc7"
:
在我的 api/policies
文件夹中,我有 flash.js
:
// flash.js policy
module.exports = function(req, res, next) {
res.locals.messages = {
success: [],
error: [],
warning: []
};
if(!req.session.messages) {
req.session.messages = { success: [], error: [], warning: [] };
return next();
}
res.locals.messages = _.clone(req.session.messages);
// Clear flash
req.session.messages = { success: [], error: [], warning: [] };
return next();
};
在我的 api/services
中,我有 FlashService.js
:
// FlashService.js
module.exports = {
success: function(req, message) {
req.session.messages['success'].push(message);
},
warning: function(req, message) {
req.session.messages['warning'].push(message);
},
error: function(req, message) {
req.session.messages['error'].push(message);
}
}
我的 config/policies.js
也配置了 flash
策略:
// config/policies.js
module.exports.policies = {
'*': [true, 'flash'],
'UserController': {
'join': ['flash'],
},
};
现在,通过所有这些设置,我如何使用它的示例在我的 UserController
中用于我的 join
操作:
module.exports = {
join: function(req, res) {
// If username, email, and password compare come back true: create user.
if(newUser.username && newUser.email && newUser.password == newUser.confirmPassword) {
// Logic to create user.
res.view();
// If not, then report an issue.
} else {
FlashService.error(req, 'There was an issue.');
res.view();
};
}
};
最后,我的观点与我链接的讨论的代码完全相同。我在这上面使用 EJS
:
<% if (messages && messages['error'].length > 0) { %>
<div class="alert alert-danger">
<% messages['error'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
<% if (messages && messages['warning'].length > 0) { %>
<div class="alert alert-warning">
<% messages['warning'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
<% if (messages && messages['success'].length > 0) { %>
<div class="alert alert-success">
<% messages['success'].forEach(function(message) { %>
<%= message %>
<br>
<% }); %>
</div>
<br>
<% } %>
我做错了什么?任何帮助将不胜感激!
谢谢,
在执行控制器之前正在读取您的消息(并且只是在读取消息后设置消息)。 req 对象在您的视图中可用,您应该直接将 req.session.messages['xxxx'] 读入您的视图。