2017-05-08 79 views
0

在表格中显示来自猫鼬的数据。如何使删除按钮才能正常工作,从表中删除所选元素猫鼬 - 删除选定元素

的index.html

<div class="col-md-12 column list-group"> 
     {% for note in notes %} 
     <div class="list-group-item"> 
      <div>Note from <em><strong>{{ note.memberName }}</strong></em> on: {{ note.createdOn.toDateString() }}`` 
       - for project: <strong>{{ note.project }}</strong></div> 
      <div><strong>Work yesterday:</strong> {{ note.workYesterday }}</div> 
      <div><strong>Work today:</strong> {{ note.workToday }}</div> 
      <div><strong>Impediment:</strong> {{ note.impediment }}</div> 

      <form action="/delete" method="post"> 
       <button class="btn btn-danger" type="submit">DELETE</button> 
      </form> 
     </div> 
     {% endfor %} 

index.js

router.post('/delete', function(req, res, next) { 
var id = req.body.id; 
Standup.findByIdAndRemove(id).exec(); 
res.redirect('/'); 
}); 

image preview

+0

你会得到任何错误吗? – Karim

+0

你的问题是什么? –

回答

0

目前尚不清楚,但根据您提供的代码,它似乎并没有发送您要删除的笔记的ID到您的服务器。你可以做到这一点的一种方法是通过添加一个隐藏的表单字段与id note的值。例如你的方式都像这样(假设你有机会获得note.id在客户端:

<form action="/delete" method="post"> 
    <input type="hidden" name="id" value="{{ note.id }}"> 
    <button class="btn btn-danger" type="submit">DELETE</button> 
</form> 

当您提交表单这样,你会在发送注释的id的值您的服务器的请求主体和能够从您的req.body访问

至于其他的答案已经提到的,你也应该提供一个回调的第二个参数findByIdAndRemove,因为它是异步的,例如:。

router.post('/delete', function(req, res, next) { 
    var id = req.body.id; 
    Standup.findByIdAndRemove(id, function (err, deletedStandUp) { 
     // handle any potential errors here 
     res.redirect('/');   
    }); 
}); 

这样,直到删除完成或引发错误,您的重定向才会发生。因此,当您的'/'路线呈现时,它将具有最新的数据。

最后,我还建议让你的路由更加RESTful,并使方法DELETE和路由名称与该控制器方法处理的资源相关(在这种情况下,它将是/note。但是这不是必要的修复你当前的问题

+0

谢谢@Shaka,您的回放正是我所需要的。 这个隐藏领域的技巧非常棒! – perija

0

你想要做

findByIdAndRemove(id,function(){ 
     res.redirect('/'); 
}); 

这样,它只会在删除项目后重定向到网页。第二个参数是回调。

0

你应该等待删除请求的回调:

router.post('/delete', function(req, res, next) { 
    var id = req.body.id; 
    Standup.findByIdAndRemove(id, function (err, deletedStandUp) { 
     if(err){ 
     res.status(500); 
     } 
     res.redirect('/');   
    }); 
}); 

您还可以添加状态码404如果请求的对象没有找到,但似乎有必要也没有,因为这是一个删除。所以它实际上取决于你的需求:

router.post('/delete', function(req, res, next) { 
    var id = req.body.id; 
    Standup.findByIdAndRemove(id, function (err, deletedStandUp) { 
     if(err){ 
     res.status(500); 
     } else if(!deletedStandup){ 
     res.status(404); 
     } 
     res.redirect('/');   
    }); 
}); 

以另一种方式删除请求与删除更好的利用,而不是职位:

router.delete(function (req, res) { 
    var id = req.params.startup_id 
    ... 
}); 
+0

谢谢Dromat非常明确的解释,问题解决了:) – perija

0

你会需要传递消息的ID后面的URL参数或表单的一部分(看起来像使用body,所以它应该是一个输入)。

你可以通过使用note._id(我相信这是自动生成猫鼬)来获取id。