2017-12-19 27 views
0

JSFiddle:http://jsfiddle.net/WdVDh/101/AngularJS - ngRepeatソーティングは配列の長さを変更します

何らかの理由で、ng-repeatリストのソートオプションを変更すると、配列の長さが変わり、ローカルコピーですべての項目が削除されます。

'showLeavers' $フィルタディレクティブにリンクされたチェックボックスを使用して、完了した 'leaveDate'プロパティで従業員をフィルタリングするオプションを含む、フィルタ/ソートの組み合わせを使用しました。

ローカルコピーでは、チェックボックスが選択されておらず、2番目または3番目の並べ替えオプションが選択されていると、配列はクリアされるので、ng-repeatリストには何も表示されません。第1または第4の選別オプションが選択されると、リストは必要に応じて表示される。

明らかに、私は上記の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

、あなたは、要素のインデックスを提供する必要があり、どのくらいの要素をあなたにスプライスしたい:

matches.splice(matches.indexOf(value), 1); 

または、あなたはちょうどこのよう.filter()使用することができます。

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

パーフェクト、(私は実際にそれが何をするか理解しているため、その1を使用)最初の行で私の地元のバージョンでそれを固定します –

関連する問題