我有一个列出事件的页面,管理员可以使用AJAX调用删除单个项目。我想在删除一个事件时重新加载页面,但是我很难用我目前对express'通常的req,res和next的理解来实现它。
这是我目前的实施(简化):
简单的jQuery代码:
$(".delete").click(function(e){
$.post("/events/delete",{del:$(this).val()})
})
在我的路线文件中:
function eventCtrl(req,res){
Event.find({}).exec(function(err,events){
...
var context = {
events:events,
...
}
res.render('events',context);
});
}
function deleteCtrl(req,res,next){
Event.findById(req.param("del")).exec(function(err,event){
// delete my event from google calendar
...
event.remove(function(err){
...
return next();
});
});
}
app.get('/events',eventCtrl);
app.post('/events/delete',deleteCtrl,eventCtrl);
当我使用AJAX发出post请求时,所有req处理程序都被调用,事件被成功删除,但没有重新加载。我误解了res.render()的作用吗?
我在jQuery代码中尝试使用成功处理程序,当我发出post请求时,使用deleteCtrl中的res.redirect(),但在这种情况下我的上下文是未定义的。
答案 0 :(得分:2)
在客户端,您正在使用
$(".delete").click(function(e){
$.post("/events/delete",{del:$(this).val()})
})
当收到来自帖子的回复时,此代码不会指示浏览器执行任何操作。因此浏览器中没有任何可见的内容。
您的问题不在于服务器端;服务器使用上下文对象进行回答。你只是没有做这个答案。
尝试简单地添加successHandler。
答案 1 :(得分:0)
一般来说,这不是最佳做法。你想要做的是协调数据。如果删除成功,那么只有splice
数组中的对象存在于客户端。另一种方法是实际发回一个刷新的数据集:
res.json( /* get the refreshed data set */ );
然后在客户端,在回调中,您实际上只是根据结果设置数据源:
... myCallback(res) {
// refresh the data source(s) from the result
}