IT TIP

AngularJS ngRepeat 요소 제거

itqueen 2020. 12. 26. 16:21
반응형

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에 배치되는 지시문을 작성하는 것에 대해 생각하고 있었고 다음과 같은 작업을 수행했습니다.

  1. 부모 요소 중에서 ngRepeat를 찾습니다 .
  2. 반복되는 내용을 읽습니다 (첫 번째 경우 'user.emails', 두 번째 경우 'user.phones').
  3. 제거 $ 인덱스 에서 요소 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

반응형