【发布时间】:2018-10-01 09:02:20
【问题描述】:
更新由于错误编辑了我的原始代码。
这是我在这里发布的第一个问题,所以请保持温和。 :)
我正在使用带有 Express 和 EJS 表单的 node.js。
我想要实现的是在带有新数据的 jQuery POST 请求之后重新渲染 EJS 模板。这是我正在尝试做的一个简化示例(我的原始代码包含很多大惊小怪、SQL 查询并且没有正确重构)。
我的目标是在按下页面上的按钮时使用不同的数据呈现 same 模板。当前发生的情况是,当我按下按钮时,数据在那里(在控制台中检查),但页面不会再次使用新数据呈现。我完全没有想法,并且已经坚持了将近一天。
我知道我可以做类似的事情
res.send(JSON.stringify(myData));
并使用 JS 脚本构建 HTML,但如果能够使用 EJS 以获得更好的可读性,那就太好了 - 我的原始代码包含很多 HTML 元素。
真的可行吗?或者这是使用 Express 进行渲染的预期行为?对不起,如果我一无所知,因为我对 Web 开发相当陌生。
无论如何,这是我的代码,非常感谢所有想法。谢谢!
test_dynamic.ejs:
<html>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<form method="post" action="/test">
<wrapper>
<h1>
<button id="toggleButton" onclick="toggle()" type="button">Toggle</button>
</h1>
<div>
<% console.log('Should show ' + name + ' with id: ' + id) %>
<li><%=name %></li>
<li><%=id %></li>
</div>
</wrapper>
</form>
</html>
<script>
var shouldShowJohn = false;
function toggle () {
var postData = {};
shouldShowJohn = !shouldShowJohn;
if (shouldShowJohn)
postData.mode = 1;
else
postData.mode = 2;
$.post('http://localhost:3000/test', postData, function (data) {
$('#toggleButton').html('').append('Showing ' + postData.mode);
});
}
</script>
routes.js:
router.get('/test', (req, res) =>{
var obj = {
name: 'DefaultName',
id: 1
}
res.render('test_dynamic', obj);
})
router.post('/test', (req, res) => {
var obj = {};
console.log('req.body.mode: ' + req.body.mode);
if (req.body.mode == 1)
obj = {
name: 'John',
id: 2
}
else
obj = {
name: 'Karl',
id: 3
}
res.render('test_dynamic', obj)
})
【问题讨论】:
-
问题在于 POST 请求不是 GET 请求,因此您的浏览器不会重新加载页面。工作流程是:1. 发送 POST,2. 响应成功/失败 3. 如果成功,从服务器重定向/重新请求同一页面。
-
兰迪,感谢您的回复!我该如何回应成功/失败?您可以指出我的任何文档/教程吗?
-
写得很好的问题。
标签: javascript jquery node.js express ejs