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」から何も返さないようにしました。何も返さないと、Resourceインスタンスが完全に保持され、「0」を返すと「1」を返すのと同じ結果になります。

テンプレートが正しくレンダリングされるようにこのリソースインスタンスを完全に削除するために、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 に答える