2017-12-19 35 views
0

JSFiddle : http://jsfiddle.net/WdVDh/101/.AngularJS - ngRepeat 정렬은 배열 길이를 변경합니다.

어떤 이유에서 ng-repeat 목록의 정렬 옵션을 변경하면 배열의 길이가 변경되고 로컬 복사본에 모든 항목이 제거됩니다.

필자는 'showLeavers'$ 필터 지시문에 연결된 확인란 선택을 통해 완료된 'leaveDate'속성으로 직원을 필터링하는 옵션을 포함하여 필터/정렬 조합을 사용했습니다.

로컬 복사본에서 확인란을 선택하지 않고 두 번째 또는 세 번째 정렬 옵션을 선택하면 배열이 지워 지므로 ng-repeat 목록에 아무 것도 나타나지 않지만 확인란을 선택하면 첫 번째 또는 네 번째 정렬 옵션이 선택되면 목록이 나타납니다.

분명히 위의 JSFiddle에서와 비슷한 것을 보여줄 수 있기 때문에 분명히 코드 어딘가에 문제가 있습니다 (필자는 필터 지시어를 추측 할 것입니다).


HTML :

<md-list-item ng-repeat="employee in employees | orderBy: sortEmployees | filter: searchEmployees | showLeavers:showLeaver"> 

<md-input-container class="col-xs-12 col-sm-6 col-md-3"> 

    <label>Sort by</label> 

    <md-select ng-model="allEmployees.sortEmployees"> 

     <md-option selected value="surname">Surname - A to Z</md-option> 

     <md-option value="-surname">Surname - Z to A</md-option> 

     <md-option value="forename">Forename - A to Z</md-option> 

     <md-option value="-forename">Forename - Z to A</md-option> 

    </md-select> 

</md-input-container> 

<md-checkbox ng-model="showLeaver">Show Leavers?</md-checkbox> 

필터 : 당신은 당신의 .splice()을 변경해야

app.filter('showLeavers', function() { 
return function (employees, showLeaver) { 
    var matches = []; 

    angular.forEach(employees, function(value) { 
     matches.push(value); 

     if (value.leaveDate && !showLeaver) { 
      matches.splice(value); 
     } 
     return matches; 
    } 
}) 

답변

1

, 당신은 요소의 인덱스를 제공 할 필요가 얼마나 많은 요소가 당신에게 이어 붙이기 :

그냥 이런 .filter() 사용할 수 있습니다

또는 :

var matches = employees.filter(match => match.leaveDate.length <= 0 || showLeaver); 
+0

완벽한, 첫 번째 줄에 내 로컬 버전에 고정 (하나는 않습니다 실제로 이해하기 때문에 어떤 것을 사용)을 –