AngularJS ngRepeat 요소 제거
ngRepeat 지시문 내에서 항목 제거를 구현하는 방법에 대한 몇 가지 질문이 있으며 내가 알아 낸 것처럼 ngClick 을 사용 하고 항목의 $ index 전달하는 일부 제거 함수를 트리거 하는 것으로 귀결 됩니다.
그러나 여러 ngRepeats가있는 예는 어디에서도 찾을 수 없습니다.
<div ng-controller="MyController">
<div ng-repeat="email in user.emails">
{{ email }} <a href>Remove</a>
</div>
<div ng-repeat="phone in user.phones">
{{ phone }} <a href>Remove</a>
</div>
</div>
이를 위해 ngClick on Remove anchor를 사용하여 호출되는 $ scope.removePhone 및 $ scope.removeEmail 을 만들어야 합니다. 하지만 좀 더 일반적인 솔루션을 찾고 있습니다. 특히 ngRepeats 가 많은 페이지가 많기 때문에 .
Remove anchor에 배치되는 지시문을 작성하는 것에 대해 생각하고 있었고 다음과 같은 작업을 수행했습니다.
- 부모 요소 중에서 ngRepeat를 찾습니다 .
- 반복되는 내용을 읽습니다 (첫 번째 경우 'user.emails', 두 번째 경우 'user.phones').
- 제거 $ 인덱스 에서 요소 THAT 모델을.
따라서 마크 업은 다음과 같습니다.
<div ng-controller="MyController">
<div ng-repeat="email in user.emails">
{{ email }} <a href remove-directive="$index">Remove</a>
</div>
<div ng-repeat="phone in user.phones">
{{ phone }} <a href remove-directive="$index">Remove</a>
</div>
</div>
내가 찾고있는 것이 달성 가능하고이를 수행하는 데 선호되는 방법은 무엇입니까?
현재 해키 솔루션
현재 내가하는 방법은 다음과 같습니다. 그것은 엉망이고 못 생겼지 만 내가 더 예쁜 방법을 찾을 때까지 일을 끝낸다.
myAppModule.controller('MyController', function ($scope, $parse, $routeParams, User) {
$scope.user = User.get({id: $routeParams.id});
$scope.remove = function ($index, $event) {
// TODO: Find a way to make a directive that does this. This is ugly. And probably very wrong.
var repeatExpr = $($event.currentTarget).closest('[ng-repeat]').attr('ng-repeat');
var modelPath = $parse(repeatExpr.split('in')[1].replace(/^\s+|\s+$/g, ''));
$scope.$eval(modelPath).splice($index, 1);
};
});
그리고 DOM에서 :
<div ng-repeat="email in user.email" class="control-group">
<label class="control-label">
{{ "Email Address"|_trans }}
</label>
<div class="controls">
<input type="text" ng-model="email.address">
<span class="help-inline"><a href ng-click="remove($index, $event)">{{ "Delete"|_trans }}</a></span>
</div>
</div>
제거 할 배열과 항목을 가져 오는 일반 제거 메서드를 만들 수 있습니다.
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }} <a ng-click="remove(emails, $index)">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }} <a ng-click="remove(phones, $index)">Remove</a>
</div>
</div>
$scope.remove = function(array, index){
array.splice(index, 1);
}
JS 없음
<div ng-repeat="option in options" ng-init=options=[1,2,3,4,5]>
<button ng-click="options.splice($index,1)">Remove me</button>
</div>
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails as datasource">{{ email }}
<a ng-click="datasource.splice($index,1)">Remove</a>
</div>
<div ng-repeat="phone in phones as datasource">{{ phone }}
<a ng-click="datasource.splice($index,1)">Remove</a>
</div>
</div>
A very simple and convenient way that works cross-browser is to use the 'remove' utility method from the library lodash.
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="removeItem(phones, phone)">Remove</a>
</div>
In your controller you declare then
//inject lodash dependency
//declare method in scope
$scope.removeItem = function(list, item){
lodash.remove(list,function(someItem) { return item === someItem});
}
You may of course use indexes if you like. See https://lodash.com/docs#remove
If you have used ng-repeat on an object instead of an array, do the following.
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }}
<a ng-click="remove(emails, email)">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="remove(phones, phone)">Remove</a>
</div>
</div>
$scope.remove = function(objects, o){
delete object[o.id];
}
or the more terse
<div ng-app="" ng-controller="MyController">
<div ng-repeat="email in emails">{{ email }}
<a ng-click="delete emails[email.id]">Remove</a>
</div>
<div ng-repeat="phone in phones">{{ phone }}
<a ng-click="delete phones[phone.id]">Remove</a>
</div>
</div>
presumes that the objects look like this
var emails = { '123' : { id : '123', .... } };
var phones = { '123' : { id : '123', .... } };
ReferenceURL : https://stackoverflow.com/questions/18251814/angularjs-ngrepeat-element-removal
'IT TIP' 카테고리의 다른 글
Heroku에서 Postgres DB 삭제 (0) | 2020.12.26 |
---|---|
Android : 터치 이벤트가 뷰에서 그 아래에있는 뷰로 전달되는 것을 방지하는 방법은 무엇입니까? (0) | 2020.12.26 |
무엇입니까? : Kotlin에서 수행합니까? (0) | 2020.12.26 |
주어진 횟수만큼 다른 문자열을 반복하여 NSString 만들기 (0) | 2020.12.26 |
Python 스크립트에서 셸 명령을 실행하고 종료를 기다린 후 스크립트로 돌아갑니다. (0) | 2020.12.26 |