2013-04-25 5 views
0

<li> 요소에 바인딩 된 항목의 배열은 AngularJS가있는 <ul>입니다. 각 항목 옆에있는 "항목 제거"를 클릭하여 항목을 제거 할 수 있기를 원합니다.AngularJS : 하드 코어가없는 범위에서 삭제

This answer on StackOverflow를 사용하면 요소를 삭제할 배열의 이름이 하드 코드되어 있기 때문에 목록 전체에서 사용할 수 없습니다.

JSfiddle set up에서 예를 볼 수 있습니다. 게임 옆에있는 "제거"를 클릭하면 게임이 아닌 학생이 제거됩니다.

버튼에서 this을 다시 전달하면 그 시점에서 각도 $ 범위에 액세스 할 수 있지만 부모 배열에서 해당 항목을 완전히 제거하는 방법을 알지 못합니다.

내가 할 수 ng-click="remove('games',this)" 정의 버튼이 있고 기능이 같은 모습이 : 난 동안이 기능을 깰 수있는 매우 좋은 방법처럼 보인다 내부

$scope.remove = function (arrayName, scope) { 
    scope.$parent[arrayName].splice(scope.$index,1); 
} 

(Like this JSFiddle)하지만 상위 배열을 이름을 내가 1 년 만에 코드를 편집 할 때.

아이디어가 있으십니까?

+0

왜 두 가지 기능을 사용하지 않습니까? 하나는 학생을 제거하고 다른 하나는 게임을 제거합니다. –

+0

이것은 실제로 구축하고있는 시스템의 단순화입니다. 페이지에 20 개의 서로 다른 목록이 있는데, 각 기능을 작성하기 위해 DRY에 대해 대단한 것처럼 보입니다! –

답변

2

왜 나는 this을 전달하려고 시도하지 않았습니까? this을 각도로 처리 할 필요가 거의 없습니다. (그리고 그것은 그것이 강점 중 하나라고 생각합니다!).

다음은 약간 다른 방식으로 문제를 해결하는 바이올린입니다.

http://jsfiddle.net/WJ226/5/

컨트롤러

지금

function VariousThingsCtrl($scope) { 

    $scope.students = students; 
    $scope.games = games; 

    $scope.remove = function (arrayName,$index) { 
     $scope[arrayName].splice($index,1); 
    } 
} 

대신 전체 scope를 전달하는 단순화, 왜뿐만 아니라 $index을 통과? 배열이있는 범위에 이미 있기 때문에, 그때부터 꽤 쉬워야합니다.

+0

아! 확실히 좋은 대안 - 그러나 나중에 개발에서 범위 변수의 이름을 바꾸기로 결정한 경우 (예 :'$ scope.outdoorGames = games;') 나는 html 부분에서 remove의 첫 번째 인수를 변경해야한다는 것을 기억해야합니다. 나 한테 잘못한 것 같아! ($ scope 객체 안에있는 배열에도이 코드를 사용할 수 없습니다. 너무 복잡하지는 않지만 더 복잡해집니다.) –

+0

$ scope.outdoorGames = games; outdoorGames와 게임이 같은 대상을 참조하기 때문에 여전히 작동합니다. 나는 배열 정체성에 대한 불가지론적인 해결책이 있다고 생각하지 않는다. – ganaraj

+0

나는 당신이 옳을 수도 있다고 생각한다. 나는'$ event' 객체를 사용하여 DOM을 바꾸는 것을 바랬다. (양방향 바인딩이 배열 항목)하지만 슬프게도 그렇지 않습니다! http://jsfiddle.net/jphastings/WJ226/7/ –

관련 문제