2013-02-03 156 views
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,應用程序/ json和body:「1」

這個響應的角色是刪除Resource對象的已刪除實例,但隨後Angular將其替換爲r從服務器迴應(即「1」),彷彿我正在創建或更新:

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

所以我的模板與這個新的(主要是空白)的信息,而這正是我試圖更新避免。我試過沒有從服務器返回任何東西或「0」 - 在Resource實例被完全保留並返回「0」的結果與返回「1」相同的結果中沒有返回任何結果。

爲了讓這個資源實例完全移除以便我的模板正確呈現,Angular尋找什麼響應?

回答

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); 
     }); 
    } 
    }); 
} 
+1

我把它放在回調。謝謝你的幫助。 'post。$ delete({user:「tjb1982」,action:「delete」,post_id:post.id},function(resp){column.posts.splice(i,1);});' – tjb1982

+0

這是一種方式更好的主意;我完全改變了我的答案;) –

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; 
    }); 
}); 
+0

這對我來說很好,比IMO接受的答案更清潔。 – dgig