AngularJS 범위의 배열에서 항목을 제거하는 방법은 무엇입니까?


153

간단한 할 일 목록이지만 각 항목의 목록 페이지에 삭제 버튼이 있습니다.

여기에 이미지 설명을 입력하십시오

관련 템플릿 HTML :

<tr ng-repeat="person in persons">
  <td>{{person.name}} - # {{person.id}}</td>
  <td>{{person.description}}</td>
  <td nowrap=nowrap>
    <a href="#!/edit"><i class="icon-edit"></i></a>
    <button ng-click="delete(person)"><i class="icon-minus-sign"></i></button>
  </td>
</tr>

관련 컨트롤러 방법 :

$scope.delete = function (person) {
  API.DeletePerson({ id: person.id }, function (success) {
    // I need some code here to pull the person from my scope.
  });
};

나는 시도 $scope.persons.pull(person)하고 $scope.persons.remove(person).

데이터베이스가 성공적으로 삭제되었지만 범위 에서이 항목을 가져올 수 없으며 클라이언트가 이미 가지고있는 데이터에 대해 서버에 메소드 호출을하고 싶지 않습니다.이 사람을 범위에서 제거하고 싶습니다.

어떤 아이디어?


나는이 오순절 $ route를 실행하면보기가 제대로 작동하지 않습니다. 내가 :-( 삭제 한 후 나는 항상 빈 페이지를 가지고
zx1986


이 범위에서이 아니라 배열에서 삭제에 대해 너무 많이하지 않고, 관계없이 각 같은 것, 그 단지 자바 스크립트
Xsmael

답변:


259

문제는 실제로 Angular가 아니라 Array 메서드와 관련이 있습니다. 배열에서 특정 항목을 제거하는 올바른 방법은입니다 Array.splice. 또한 ng-repeat를 사용 $index하면 전달한 배열의 현재 색인 인 특수 속성에 액세스 할 수 있습니다 .

해결책은 실제로 매우 간단합니다.

전망:

<a ng-click="delete($index)">Delete</a>

제어 장치:

$scope.delete = function ( idx ) {
  var person_to_delete = $scope.persons[idx];

  API.DeletePerson({ id: person_to_delete.id }, function (success) {
    $scope.persons.splice(idx, 1);
  });
};

1
@ScottMalachowski 당신이 맞아요. 나는 그 부분을 잊었다. 나는 그것을 반영하기 위해 답변을 수정 했으므로 귀하의 답변과 일치합니다.
Josh David Miller

13
주의 –이 색인 기반 솔루션은 뷰에서 동일한 객체의 여러 ng-repeats (예 : 예약 된 작업, 예약되지 않은 작업, 완료된 작업이 모두 $ scope.tasks에서 나오는)를 사용하는 경우 작동하지 않습니다. 인덱스 2, 3, 4 등
shacker

@shacker는 위와 같은 배열의 서로 다른 필터링 된 세트를 가진 여러 개의 ng-repeats에 대해 언급하고 있습니다. indexOf와 함께 아래 방법을 사용하십시오
Andrew Kuklewicz

4
@AndrewKuklewicz- indexOf더 비싼 작업이 될 수 있습니다. 필터링하지 않으면 완전히 필요하지 않습니다. 그러나 필터링을 사용 indexOf하면 적절한 방법이됩니다.
Josh David Miller

이 문제로 어려움을 겪고 있으며 위의 태그 생성을 약간 변경해야했습니다. {{}}을 사용하여 delete ({{$ index}})-그렇지 않으면 문자열 $ index를 얻었습니다. 절대 그 메소드를 호출하지 않습니다. delete ()와 같은 색인에 대한 언급을 제거 할 때 도움이되지만 실제로 도움이되지는 않습니다.
mikemil

310

배열 person에서 의 색인을 찾은 persons다음 배열의 splice메소드 를 사용해야합니다 .

$scope.persons.splice( $scope.persons.indexOf(person), 1 );

49
이것은 더 나은 대답입니다. 뷰의 인덱스가 범위의 배열과 동일하지 않도록 목록이 필터링되었을 때 작동합니다.
Andrew Kuklewicz

5
이것은 실제로 더 나은 대답입니다. Andrew가 언급 한 필터링 된 목록 유스 케이스 외에도이 방법은 여러 사람을 삭제하고 이러한 삭제에 대한 Ajax 요청이 순서대로 리턴되지 않는 경우에도 적용됩니다. Ajax 호출이 리턴되기 전에 행 인덱스를 사용한 경우 잘못된 행을 제거하게됩니다.
Joris

4
더 나은 경우에 있지만 같이 IndexOf와 함께 당신은 조쉬의 대답에 당신은 빠르게 인덱스와 아이템을 얻을 권리를 찾기 위해 모든 항목을 반복해야
daver

@mike- 이 폴리 필을 사용하십시오 .
Joseph Silber

8

유용한 기능 목록이있는 Underscore.js 라이브러리를 사용합니다 .

without

without_.without(array, *values)

값의 모든 인스턴스가 제거 된 배열의 복사본을 반환합니다.

_.without([1, 2, 1, 0, 3, 1, 4], 0, 1);
// => [2, 3, 4]

var res = "deleteMe";

$scope.nodes = [
  {
    name: "Node-1-1"
  },
  {
    name: "Node-1-2"
  },
  {
    name: "deleteMe"
  }
];
    
$scope.newNodes = _.without($scope.nodes, _.findWhere($scope.nodes, {
  name: res
}));

JSFiddle의 데모를 참조하십시오 .


filter

var evens = _.filter([1, 2, 3, 4, 5, 6], function(num){ return num % 2 == 0; });

// => [2, 4, 6]

$scope.newNodes = _.filter($scope.nodes, function(node) {
  return !(node.name == res);
});

바이올린 데모를 참조하십시오 .


$scope.nodes = _.without($scope.nodes, node);node
jake

최신 브라우저에서는을 사용할 수 있습니다 Array.prototype.filter. _.filter(array, fun)됩니다 array.filter(fun).
bfontaine

7
$scope.removeItem = function() {
    $scope.items.splice($scope.toRemove, 1);
    $scope.toRemove = null;
};

이것은 나를 위해 작동합니다!


4

list와 연관된 함수가있는 경우, 스플 라이스 함수를 작성할 때 연관도 삭제됩니다. 내 해결책 :

$scope.remove = function() {
    var oldList = $scope.items;
    $scope.items = [];

    angular.forEach(oldList, function(x) {
        if (! x.done) $scope.items.push( { [ DATA OF EACH ITEM USING oldList(x) ] });
    });
};

목록 매개 변수의 이름은 items 입니다. x.done 매개 변수 는 항목이 삭제되는지 여부를 나타냅니다.

다른 참조 : 다른 예

희망이 당신을 도와줍니다. 인사말.


2

indexOf가 -1을 반환하기 때문에 @Joseph Silber의 승인 된 답변이 작동하지 않습니다. 아마도 Angular가 $ scope.items [0]와 내 항목마다 다른 해시 키를 추가하기 때문일 수 있습니다. angular.toJson () 함수 로이 문제를 해결하려고 시도했지만 작동하지 않았습니다.

아, 이유를 알았습니다 ... 청크 방법을 사용하여 $ scope.items를 보면서 테이블에 두 개의 열을 만듭니다. 죄송합니다!


2

이것을 사용할 수도 있습니다

$scope.persons = $filter('filter')($scope.persons , { id: ('!' + person.id) });

1

Angular에는이라는 내장 함수 arrayRemove가 있습니다.이 경우 메소드는 다음과 같습니다.

arrayRemove($scope.persons, person)


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.