Angularjs delete函数的API不再工作,不再';不能从数组中删除任何内容?
当我试图从视图中删除一个帖子时,显然表明它已被删除。然而,当我返回到提供者路径时,我可以通过下面的路径找到所有先前的数组成员。但是,当我在发送/发布的路线中时,不会显示以前删除的成员。有趣的是,刷新页面后,它不再显示视图中的记录。 在下面的路径中,在我从命令提示符尝试时,post将消失: /providers/553b72c9f6d0020425d37f37/postsAngularjs delete函数的API不再工作,不再';不能从数组中删除任何内容?,angularjs,node.js,api,mongoose,Angularjs,Node.js,Api,Mongoose,当我试图从视图中删除一个帖子时,显然表明它已被删除。然而,当我返回到提供者路径时,我可以通过下面的路径找到所有先前的数组成员。但是,当我在发送/发布的路线中时,不会显示以前删除的成员。有趣的是,刷新页面后,它不再显示视图中的记录。 在下面的路径中,在我从命令提示符尝试时,post将消失: /providers/553b72c9f6d0020425d37f37/posts router.get('/providers/:provider/posts', function(req, res) {
router.get('/providers/:provider/posts', function(req, res) { Provider.findById(req.params.provider).select('posts').populate('posts').exec(function(err, provider) {
if(err){ return next(err); }
res.json(provider.posts);
});
});
然而,在这个路径中,我可以找到包含9个成员的posts数组。似乎任何被移除的都不起作用
router.get('/providers', function(req, res, next) {
Provider.find(function(err, providers){
if(err){ return next(err); }
res.json(providers);
});
});
以下是我在服务器端的删除功能:
router.delete('/providers/:provider/posts/:post',auth, function(req, res){
console.log("I ma running from server")
return Post.findById(req.params.post, function(err, post){
return post.remove(function(err){
if(!err){
Post.update({_id: post.provider}, {$pull : {posts : post._id}}, function(err, numberAffected){
console.log(numberAffected);
if(!err){
return console.log('removed post id');
} else {
return console.log(err);
}
});
console.log('post removed');
return res.send('');
} else{
console.log(err);
}
});
});
});
这里是我在工厂里的客户端:
ob.deletePost = function (provider_id,post_id) {
return $http.delete(urlBase +'/providers/' + provider_id +'/posts/' + post_id ,
{
headers: {Authorization: 'Bearer '+auth.getToken()}
});
};
在控制器中:
$scope.deletePost= function (provider_id,post_id) {
//console.log('PROVIDER',provider_id);
// console.log('POST',post_id);
// console.log('COMMENT',comment_id);
providers.deletePost(provider_id,post_id)
.success(function () {
$scope.status = 'Deleted Post! Refreshing post list.';
for (var i = 0; i < $scope.provider.posts.length; i++) {
var post = $scope.provider.posts[i];
// console.log(i,comment,comment_id)
//console.log(comment.ID);
if (post._id === post_id) {
//console.log(provider._id === provider_id)
// console.log(provider._id);
$scope.provider.posts.splice(i, 1);
//providers.getAllComments();
break;
}
}
// $scope.providers = null; // i am not sure how to write for comment as well?
})
.error(function (error) {
$scope.status = 'Unable to delete comment: ' + error.message;
});
};
$scope.deletePost=函数(提供程序id,post id){
//console.log('PROVIDER',PROVIDER\u id);
//console.log('POST',POST\u id);
//console.log('COMMENT',COMMENT\u id);
providers.deletePost(provider\u id,post\u id)
.success(函数(){
$scope.status='已删除帖子!正在刷新帖子列表';
对于(变量i=0;i<$scope.provider.posts.length;i++){
var post=$scope.provider.posts[i];
//日志(i,comment,comment\u id)
//console.log(comment.ID);
if(post.\u id==post\u id){
//console.log(provider.\u id===provider\u id)
//console.log(provider.\u id);
$scope.provider.posts.拼接(i,1);
//providers.getAllComments();
打破
}
}
//$scope.providers=null;//我也不知道如何编写注释?
})
.错误(函数(错误){
$scope.status='无法删除注释:'+错误消息;
});
};
以下是我观点的一部分:
<div ng-repeat="provider in providers"> <!-- | orderBy:'-upvotes'-->
<span class="glyphicon glyphicon-thumbs-up"
ng-click="incrementUpvotes(provider)"></span>
<span style="font-size:18px; margin-left:10px;">
{{provider.upvotes}} - <strong>{{provider.name}}</strong>
<span ng-if="provider.posts.length !== 0">
<a ui-sref="post({provider_id : provider._id})">{{provider.posts.length}} Posts </a>
<button class="btn btn-xs btn-info pull-right" ng-click="modalUpdateProvider('size',provider)">Edit</button>
</span>
{{provider.upvoces}-{{provider.name}}
.
谢谢。我相信您在更新声明中使用了错误的型号:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {
console.log("I ma running from server");
// NOTE: you could also include a where clause to ensure the
// provider ID matches as well. This would prevent someone from using any
// provider ID (inclduing one that doesn't exist) with a post ID.
return Post.findById(req.params.post, function(err, post) {
// Might want to check for an error here
console.log('post removed');
return post.remove(function(err) {
if (!err) {
//Post.update({
Provider.update({
_id: post.provider // or req.params.provider
}, {
$pull: {
posts: post._id
}
}, function(err, numberAffected) {
console.log(numberAffected);
if (!err) {
console.log('removed post id');
} else {
console.log(err);
}
return res.send('');
});
} else {
console.log(err);
}
});
});
});
此外,您还可以使用findByIdAndXXX方法以及内置承诺将这些方法链接在一起,以便于阅读:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {
console.log("I ma running from server");
// NOTE: you could also include a where clause to ensure the
// provider ID matches as well. This would prevent someone from using any
// provider ID (inclduing one that doesn't exist) with a post ID.
return Post.findByIdAndRemove(req.params.post).exec().then(function(post) {
console.log('post removed');
return Provider.findByIdAndUpdate(req.params.provider, {
$pull: {
posts: post._id
}
}, {
new: true
} // Return updated document
).exec(); // return promise to be evaluated for next handler
}).then(function(provider) {
console.log('removed post id');
res.send('');
}).then(null, function(err) {
console.log(err);
//might want to send a response error here
});
});
更新:要使用where子句,您需要切换到findOneAndXXX方法:
router.delete('/providers/:provider/posts/:post', auth, function(req, res) {
console.log("I am running from server");
return Post.findOneAndRemove({_id: req.params.post, provider_id: req.params.provider}).exec().then(function(post) {
console.log('post removed');
return Provider.findByIdAndUpdate(req.params.provider, {
$pull: {
posts: post._id // or req.params.post
}
}, {
new: true
} // Return updated document
).exec(); // return promise to be evaluated for next handler
}).then(function(provider) {
console.log('removed post id');
res.send('');
}).then(null, function(err) {
console.log(err);
//might want to send a response error here
});
});
您可以删除服务器端的a post,但不更新客户端的提供程序。您必须重新加载提供程序或手动删除帖子。@michael,我更新了新的。我在控制器里面做的,你太棒了。。多谢各位@Jason更新了答案以显示如何在查询中执行。那么,您是指仅使用findOneAndRemove的from where子句?因为我看不出和前一个有多大区别。我想你是指条件语句。Mongoose在内部将条件对象转换为mongoDB的where子句。