2015-02-02 2 views
1

에서 반환 된 컬렉션 조작 API에서 메시지를 반환하는 Message이라는 서비스가 있습니다. 그것은 단순히 다음과 같습니다

app.factory('Message', function($resource) { 
    return $resource('http://localhost:3000/messages/:id'); 
}); 

그것은 잘 작동, 나는 내 범위에 메시지를 할당 할 내 컨트롤러에서 사용 : 나는 브라우저의 콘솔에서 $scope.messages을 로그인하면

app.controller('MessagesCtrl', function($scope, Message) { 
    $scope.messages = Message.query(); 
} 

, 그것은 모양을 다음과 같습니다 :

[$promise: Promise, $resolved: false] 
    0: Resource 
    1: Resource 
    2: Resource 
    3: Resource 
    $promise: Promise 
    $resolved: true 
    length: 4 
    __proto__: Array[0] 

지금까지는 4 가지 메시지가 있습니다. 이 컬렉션에서 요소 제거, 업데이트 및 추가와 같은 요소를 구체적으로 조작 할 수 있기를 원합니다.

$scope.messages = $scope.messages.filter(function(obj) { 
    return (object.id != 6); 
}); 

하지만이 빈 콜렉션으로 $scope.messages 변 :

this answer을 바탕으로, 이것은 내가 특정 ID로 메시지를 제거하려고 한 것입니다. ID로이 리소스 모음에서 특정 요소를 제거하려면 어떻게해야합니까? 또한이 컬렉션의 기존 요소를 다른 객체로 대체하는 방법은 무엇입니까?

답변

2

$ resource는 (편리한 방법으로) 약속의 자동 확장을 수행하고 반환 된 객체 자체에 응답을 첨부하므로 데이터를보기에 바인딩 할 때 매우 편리합니다 (약속 확인 후 실행되는 다이제스트주기가 DOM을 업데이트하므로 해결 된 데이터가있는 바운드 개체가 있음) 데이터를 직접 조작 할 때는 특히 해결하기 전에 액세스하려고 할 때 그렇게 많이하지 않습니다. 따라서 데이터를 조작하려는 경우 약속이 해결 될 때까지 기다려야합니다.

즉 : -

//chain through the promise. 
    Message.query().$promise.then(function(messages){ 
     $scope.messages = messages.filter(function(obj) { 
     return (obj.id != 6); 
     }); 
    }); 

또는 당신은뿐만 아니라 (기존의 코드와 함께) 할 수있는 :

$scope.messages.$promise.then(function(messages){ 
    //Since you are overwriting the object here, there will no longer be a $Promise property so be careful about it when you try to chain through elsewhere after this 
    $scope.messages = messages.filter(function(obj) { 
     return (obj.id != 6); 
     }); 
    }); 
+0

완벽한을, 감사합니다. 나는 $ resource을 사용하지 않기로 결정했다. 왜냐하면 콜렉션을 조작 한 후에 조작 된 항목에 promise 속성이 첨부되어 있지 않기 때문이다. – weltschmerz