1

我有一个 AngularJS $resource

App.factory("pjApi", ["$resource", function($resource) {
  return $resource("/api/:user/:action/:post_id/", {action:"posts"});
}]);

在我的控制器中,我基本上是这样使用它的:

$scope.deletePost = function(post_id) {
    $scope.posts.forEach(function(post) {
        if (post_id === post.id)
            post.$delete({user:"tjb1982",action:"delete",post_id:post.id});
    });
}

服务器给出状态为 200、application/json 和 body:"1" 的响应

Angular 对此响应所做的是删除已删除的 Resource 对象实例,但随后 Angular 将其替换为来自服务器的响应(即“1”),就像我正在创建或更新一样:

posts [Resource { 0="1", $$hashKey="00D", $get=function(), more...}]

等等

所以我的模板更新了这个新的(大部分是空白的)信息,这是我试图避免的。我尝试从服务器不返回任何内容或“0”——不返回任何内容会导致资源实例被完全保留,返回“0”的结果与返回“1”的结果相同。

为了让这个 Resource 实例被完全删除以便我的模板正确呈现,Angular 正在寻找什么响应?

4

2 回答 2

10

调用$delete资源只向服务器发送 HTTP 请求;如果您想从某些客户端表示(例如数组)中删除该项目,您必须自己这样做。

因此,对于您的示例,您可以尝试以下操作:

$scope.deletePost = function(post_id) {
  $scope.posts.forEach(function(post, index) {
    if (post_id === post.id) {
      post.$delete({user:"tjb1982",action:"delete",post_id:post.id}, function() {
        $scope.posts.splice(index, 1);
      });
    }
  });
}
于 2013-02-03T04:08:15.450 回答
5
// instance is cleared on success
post.$delete({/* request data */}, function() {
    // remove empty element from array
    $scope.posts = $scope.posts.filter(function(el) {
        return el.id !== undefined;
    });
});
于 2014-11-15T22:03:52.910 回答